Вопрос: Как перенести все файлы из текущего каталога в верхний каталог?


Как перенести все файлы из текущего каталога в верхний каталог в Linux?

Я попробовал что-то вроде mv *.*, но это не сработает.


125
2017-10-28 18:54


Источник


У меня недостаточно ответов, чтобы повторить вопросы, но могу ли я предложить [linux] [mv] [cwd] [files], или что-то подобное? - Stephan202
Я повторил этот вопрос по просьбе Stephan202. - eleven81
unix.stackexchange.com/a/251091/139312 - palindrom


Ответы:


Команда, которую вы ищете

mv * .[^.]* ..

или (см. ниже для получения дополнительной информации):

(shopt -s dotglob; mv -- * ..)

Объяснение: mv команда перемещает файлы и каталоги. Последний аргумент mv является целью (в этом случае каталог на один шаг «вверх» в дереве, ..). Аргументами до этого являются исходные файлы и каталоги. Звездочка (*) является подстановочным знаком, который соответствует всем файлам, которые не начинаются с точки. Файлы, начинающиеся с точки (dotfiles), «скрыты». Они сопоставляются с использованием шаблона .[^.]* (см. ниже).

См. Справочную страницу, которую я связал для получения дополнительной информации о mv,


Зачем .[^.]* вместо .* ?

В виде Крис Джонсен правильно указывает: шаблон .* также соответствует . а также .., Поскольку вы не хотите (и не можете) переместить их, лучше использовать шаблон, который соответствует любому имени файла, начиная с точки за исключением тех двух, Шаблон .[^.]* делает это: он соответствует любому имени файла (1), начинающемуся с точки (2), за которой следует символ, который не точка (3), за которой следует ноль или более произвольных символов.

В виде Paggas  указывает на то, мы также должны добавить шаблон .??* чтобы соответствовать файлам, начинающимся с двух точек. См. Его ответ на альтернативное решение, используя find,

Арьян-х ответ упоминает shopt чтобы избежать всех этих проблем с помощью dotfiles. Но тогда есть проблема с файлами, начинающимися с тире. И это требует трех команд. Тем не менее, мне нравится идея. Я предлагаю использовать его так:

(shopt -s dotglob; mv -- * ..)

Это выполняется shopt в подоболочке (таким образом, нет второго вызова shopt требуется) и использует -- так что файлы, начинающиеся с тире, не будут интерпретироваться как аргументы mv,


192
2017-10-28 19:01



С помощью .* может вызвать милливольт для получения предупреждений / ошибок о невозможности перемещения . а также .., Вы можете попробовать mv * .[^.]* .. вместо. - Chris Johnsen
Очень полное ответное спасибо.
@alain: добро пожаловать и добро пожаловать на сайт! (Если (и только если) один из сообщений здесь достаточно ответил на ваш вопрос, тогда вы можете отметить его как таковой. Это даст 15 дополнительных очков репутации, а также даст вам 2 дополнительных ответа.) - Stephan202
Мне очень нравится, что решение магазина работает в подоболочке :) - Paggas
Нет никакого вреда в синтаксисе *. *, В том числе .. является опасным только при использовании с chmod и chown и флагом «recurse», то есть chmod -R или chown -R. И в тех случаях, никогда Когда-либо type chown. * или chmod. * - chown верхний каталог в пути, который вы ищете, и используйте -h (не следуйте символическим ссылкам). Но, мв .. просто ничего не делает, поэтому не беспокойтесь об этом. - chris


Краткий ответ: используйте

find . -mindepth 1 -maxdepth 1 -exec mv -t.. -- {} +

Длительный ответ:

Команда

mv * .* ..

не будет работать с тех пор .* может совпадать . а также .., Но команда

mv * .[^.]* ..

также не будет работать, поскольку .[^.]* не будет соответствовать, например, ..filename! Вместо этого то, что я делаю, это

mv * .[^.] .??* ..

который будет соответствовать всем, кроме . а также .., * будет соответствовать всему, что не начинается с ., .[^.] будет соответствовать всем 2 символам имен файлов, начиная с точки, кроме .., а также .??* будет соответствовать всем именам файлов, начиная с точки с не менее чем 3 символами.

Еще лучше, вы можете использовать

find . -mindepth 1 -maxdepth 1 -exec mv -t.. -- {} +

который позволяет избежать уродливых взломов глобусов в mv * .[^.] .??* ..!


41
2017-10-28 20:19



Спасибо :) Я бы прокомментировал вам сообщение, но пока у меня не хватает репутации. - Paggas
Кроме того, я забыл отметить важность - так, чтобы команда корректно работала с именами файлов, начиная с тире. Я включил - в мой находный ответ. Более полный ответ с использованием globs - «mv - *. [^.]. ?? * ..». - Paggas
+1: Я вернулся, чтобы добавить ..?* на мой комментарий, и вы уже позаботились об этом. - Chris Johnsen
Что может быть неправильно с попыткой mv ..? Он просто ничего не делает и ничего не может сделать. Существуют и другие команды, в которых Можно что-то (chmod и chown), но mv и rm просто ничего не делают. или .. - chris
Это дает mv: незаконный вариант - t - pal4life


Просто для полноты, можно также сказать оболочке Bash, чтобы включить скрытые файлы, используя shopt:

shopt -s dotglob
mv -- * ..
shopt -u dotglob

12
2017-10-28 20:52



+1. Гораздо чище. Я думаю, что небольшое улучшение в порядке. См. Обновление моего ответа. - Stephan202


В mv отсутствует функциональность перемещения скрытых файлов при использовании * - Так почему бы не использовать копию вместо этого?

cp -rf . ..

rm -rf *

Не нужно вдаваться в сложные решения dotglobbing и использовать команды find.


8
2017-08-02 20:46



Предупреждение Если вы двигаетесь в такая же файловая система, в самой большой части случаев вы действительно не копировали файлы, а только обновляли записи в каталоге без перемещения inode или файловых контентов. См. Даже [1]. С cp а также rm вместо этого вы действительно копируете все. - Hastur


rsync -a --remove-source-files . ..

rsync является чрезвычайно мощным инструментом копирования файлов, обычно используемым для выполнения эффективных инкрементных удаленных резервных копий и зеркал.

С помощью приведенной выше команды мы говорим rsync скопировать содержимое . в ..

Выключатель -a позволяет рекурсию в . подкаталогов и позволяет использовать некоторые другие общие параметры.

Выключатель --remove-source-files сообщает rsync об удалении исходных файлов после успешной копии, т. е. делает rsync вести себя аналогично mv команда.


6
2018-01-20 11:47



Еще немного объяснений было бы неплохо. - ChrisF
Конечно, надеюсь, теперь это станет более ясным. - mrucci
Обратите внимание, что --remove-source-files не будет удалять (синхронизированные) каталоги. - Dennis
Приятное, принятое решение дает мне -bash: /bin/mv: Argument list too long ошибка. Это работает как шарм. - userlond


В конечном счете пытается mv . произойдет сбой, потому что mv не сможет отменить связь с каталогом, в котором вы сейчас находитесь. mv * .. для перемещения файлов в cwd.


2
2017-10-28 18:59



Привет, спасибо, что сработало!


mv * .??* ../.

* получает все нетопливные файлы. .??* получает все. файлы длиной не менее трех байтов, которые работают для всех законных. Все, что осталось от вас, вероятно, rm скорее, чем mv так или иначе.

../. не дает никаких прямых преимуществ .. но при выполнении перехода к каталогу очень хорошая привычка вступать, потому что он будет терпеть неудачу, если вы хотите, если что-то не так с этим путем. Например, mv xyz bletch, где ты думать  bletch является каталогом, можно сделать более mv xyz bletch/.,


2
2017-10-28 19:47



Вы можете добавить .[^.] получить файлы обложки, например .a, - Chris Johnsen
Нет никакой разницы между ../ и ../. поэтому я бы не стал печатать. после косой черты. Кроме того, в случае mv и rm это не вред для включения. и .. в списке, т.е. нет ничего страшного или неправильного с mv *. * / path / to / file /, также как rm. или даже -rf. ничего не делает. - chris