Как переместить все файлы из текущего каталога в верхний каталог в Linux?
Я пробовал что-то вроде mv *.*
, но это не работает.
Как переместить все файлы из текущего каталога в верхний каталог в Linux?
Я пробовал что-то вроде mv *.*
, но это не работает.
Ответы:
Команда, которую вы ищете
mv * .[^.]* ..
или (см. ниже для получения дополнительной информации):
(shopt -s dotglob; mv -- * ..)
Объяснение: mv
команда перемещает файлы и каталоги. Последний аргумент mv
- это цель (в этом случае каталог на один шаг вверх по дереву ..
). Аргументы до этого - исходные файлы и каталоги. Звездочка ( *
) - это подстановочный знак, который соответствует всем файлам, которые не начинаются с точки. Файлы, начинающиеся с точки (точечные файлы), являются «скрытыми». Они сопоставляются с использованием шаблона .[^.]*
(см. Редактирование ниже).
Смотрите man-страницу, на которую я ссылаюсь, для получения дополнительной информации mv
.
.[^.]*
вместо .*
?Как правильно указывает Крис Джонсен : картина .*
также совпадает .
и ..
. Поскольку вы не хотите (и не можете) перемещать их, лучше использовать шаблон, который соответствует любому имени файла, начинающемуся с точки, кроме этих двух . Шаблон .[^.]*
делает именно это: он соответствует любому имени файла (1), начиная с точки (2), за которой следует символ, который не является точкой (3), за которой следует ноль или более произвольных символов.
Как указывает Паггас , нам также нужно добавить шаблон , чтобы сопоставить файлы, начинающиеся с двух точек. Смотрите его ответ для альтернативного решения, используя ..??*
find
В ответеshopt
Арджана упоминается , чтобы избежать всех этих проблем с точечными файлами. Но тогда проблема с файлами начинается с тире. И это требует трех команд. Тем не менее, мне нравится идея. Я предлагаю использовать это так:
(shopt -s dotglob; mv -- * ..)
Это выполняется shopt
в подоболочке (таким образом, нет второго вызова shopt
требуемого) и использует его --
так, что файлы, начинающиеся с тире, не будут интерпретироваться как аргументы mv
.
.*
может заставить mv выдавать предупреждения / ошибки о невозможности перемещения .
и ..
. Вы можете попробовать mv * .[^.]* ..
вместо этого.
*
, .[^.]*
и ..?*
. Второй может быть .[!.]*
для старых (POSIX) оболочек. Также читайте
Краткий ответ: используйте
find . -mindepth 1 -maxdepth 1 -exec mv -t.. -- {} +
Длинный ответ:
Команда
mv * .* ..
не будет работать, так как .*
может совпадать .
и ..
. Но команда
mv * .[^.]* ..
также не будет работать, так .[^.]*
как не будет соответствовать, например ..filename
,! Вместо этого я делаю
mv * .[^.] .??* ..
который будет соответствовать всем, кроме .
и ..
. *
будет соответствовать всему, что не начинается с символа a .
, .[^.]
будет соответствовать всем именам файлов, состоящим из 2 символов, начиная с точки, кроме ..
, и .??*
будет соответствовать всем именам файлов, начинающимся с точки, по крайней мере, с 3 символами.
А еще лучше, вы можете использовать
find . -mindepth 1 -maxdepth 1 -exec mv -t.. -- {} +
что позволяет избежать уродливых шаровых взломов mv * .[^.] .??* ..
!
..?*
свой комментарий, и вы уже позаботились об этом.
mv
прекратить искать дальнейшие опции команды. Скобки являются результирующим именем файла. Знак плюс говорит, что вместо запуска exec для каждого результата (т. Е. Для каждого имени файла), поместите как можно больше результатов в один exec, насколько это возможно. Для полноты, -t..
говорит переместить целевой пункт назначения, чтобы переместить все эти файлы в.
Ради полноты можно также указать оболочке Bash включить скрытые файлы, используя shopt
:
shopt -s dotglob
mv -- * ..
shopt -u dotglob
У mv отсутствует функциональность перемещения скрытых файлов при использовании *
- так почему бы не использовать вместо этого копию?
cp -rf . ..
rm -rf *
Не нужно вдаваться в сложные решения дотлогбинга и использования команд поиска.
rsync -a --remove-source-files . ..
rsync
это чрезвычайно мощный инструмент для копирования файлов, обычно используемый для выполнения эффективных инкрементных удаленных резервных копий и зеркал.
С помощью приведенной выше команды, мы говорим, rsync
чтобы скопировать содержимое .
в..
Переключатель -a
включает рекурсию в .
подкаталоги и включает некоторые другие общие параметры.
Переключатель --remove-source-files
сообщает rsync об удалении исходных файлов после успешного копирования, т. Е. Заставляет rsync вести себя аналогично mv
команде.
--remove-source-files
не будут удалены (синхронизированы) каталоги.
-bash: /bin/mv: Argument list too long
ошибку. Этот работает как шарм.
В конечном итоге попытка mv .
не удастся, потому что mv не сможет отсоединить каталог, в котором вы находитесь. Вы можете mv * ..
переместить файлы в cwd.
mv * .??* ../.
*
получает все не точечные файлы. .??*
получает все. файлы длиной не менее трех байтов, что работает для всех допустимых. Все, что осталось, вы, вероятно, хотите, rm
а не в mv
любом случае.
Он ../.
не предлагает никаких прямых преимуществ по сравнению с тем, ..
но когда вы перемещаетесь в каталог, это очень хорошая привычка, потому что он потерпит неудачу, как вы захотите, если что-то не так с путем. Например, mv xyz bletch
если вы думаете, что bletch
это каталог, вы можете быть более уверенным с mv xyz bletch/.
.
.[^.]
чтобы получить файлы обложки, как .a
.
Эта свернутая команда работает на большинстве современных оболочек:
\mv -- {,.{[^.],??}}* ..
В противном случае упоминается портативное решение:
\mv -- * .[^.] .??* ..
Функции:
\ предотвращает нежелательное изменение псевдонимов.
- предотвращает интерпретацию имен файлов, содержащих начальные дефисы (-xyz), в качестве аргументов командной строки.
. [^.] соответствует всем именам файлов из двух символов, начинающимся с. Кроме ..
. ?? * соответствует всем другим именам файлов не более трех символов.
Наивные реализации:
Следующее пропускает скрытые имена файлов UNIX, начинающиеся с. (.Bashrc).
mv * ..
Следующее совпадение .. которое рекурсивно пытается переместить каждый каталог в конце концов обратно в / в .. текущего рабочего каталога ($ PWD или pwd). Никогда не используйте.
mv .* ..
Это более правильно использовать шаблон , * .[!.] .??*
чем , * .[^.] .??*
так как первый будет также работать со старыми оболочками , такими как ksh88:
mv -- * .[!.] .??* ..
--
предотвращает проблемы, когда у вас есть имя файла, которое начинается с -
*
соответствует всем именам файлов, которые не начинаются с .
.
которую вы можете / должны переместить.[!.]
соответствует всем двум именам файлов символов, которые начинаются с .
.??*
соответствует всем именам файлов (или длиннее) из трех символов, которые начинаются с .
При использовании ksh88 шаблон имени файла .[^.]
будет фактически соответствовать именам файлов ..
(которые всегда существуют) и .^
(которые, вероятно, не существуют), что будет иметь эффект, противоположный желаемому.
Найти и grep работы тоже. Такая структура может быть полезна, если вы хотите выбрать файлы по более сложным критериям, изменив find и egrep.
find -maxdepth 1 | egrep '^./.' # Returns all files
mv `find -maxdepth 1 | egrep '^./.'` .. # mv <all files> ..
Я думаю, что самое простое решение для перемещения всех файлов в родительский каталог. было бы
mv "`ls`" ../
или, если есть скрытые файлы / каталоги
использовать:
mv "`ls -a`" ../ 2>/dev/null
Также, допустим, вы хотите переместить содержимое какой-либо папки в одну из ее внутренних папок tony (скажем)
использовать:
mv "`ls -a`" /tony 2>/dev/null
Примечание:
"`ls -a`"
Переместить файлы, в которых есть пробелы.
2>/dev/null
Предназначен для подавления предупреждения / ошибки, поскольку ls -a
распечатывает также .
и ..
папку, и вы не можете переместить или скопировать их. Таким образом, для этих папок будет отображаться ошибка (если мы не используем 2> / dev / null), что он не может их перемещать, а остальные будут перемещаться довольно удобно.
Лучше всего избегать, ls -a
если нет скрытых файлов и просто использовать ls
.
mv $(ls -a)
? Это будет касаться текущего каталога и каталога под ним, потому что ls -a
будет выводиться ..
также.
mv ls -a ../
он также работал бы по необходимости. Да, он покажет те ошибки, как я упоминал выше, но кроме этого он переместит необходимые папки / файлы в родительский каталог.
ls
, чтобы переместить файлы с пробелами. Я сделал необходимые изменения. Спасибо за указание.
[linux] [mv] [cwd] [files]
или что-то подобное?