Как переместить все файлы из текущего каталога в верхний каталог в Linux?
Я пробовал что-то вроде mv *.* , Но это не работает.
Команда, которую вы ищете
mv * .[^.]* ..
или (см. ниже для получения дополнительной информации):
(shopt -s dotglob; mv -- * ..)
Объяснение: команда mv перемещает файлы и каталоги. Последний аргумент для mv - это цель (в этом случае каталог на один шаг вверх по дереву, ..). Аргументами до этого являются исходные файлы и каталоги. Звездочка (*) - это подстановочный знак, который соответствует всем файлам, которые не начинаются с точки. Файлы, начинающиеся с точки (точечные файлы), "скрыты". Они сопоставляются с использованием шаблона .[^.]* (см. правку ниже).
Смотрите man-страницу, на которую я ссылаюсь, для получения дополнительной информации о mv .
.[^.]* вместо .* ?Как правильно указывает Крис Джонсен : шаблон .* Также совпадает . и .. Поскольку вы не хотите (и не можете) перемещать их, лучше использовать шаблон, который соответствует любому имени файла, начинающемуся с точки, кроме этих двух. Шаблон .[^.]* делает именно это: оно соответствует любому имени файла (1), начиная с точки (2), за которой следует символ, который не является точкой (3), за которой следует ноль или более произвольных символов.
Как указывает Паггас, мы также должны добавить шаблон .??* для сопоставления файлов, начинающихся с двух точек. Посмотрите его ответ для альтернативного решения, используя find.
В ответе Арджана упоминается shopt , чтобы избежать всех этих проблем с точечными файлами. Но тогда проблема с файлами начинается с тире. И это требует трех команд. Тем не менее, мне нравится идея. Я предлагаю использовать это так:
(shopt -s dotglob; mv -- * ..)
Это выполняет shopt в подоболочке (таким образом, второй вызов shopt требуется) и использует -- так что файлы, начинающиеся с тире, не будут интерпретироваться как аргументы mv .
Краткий ответ: используйте
find . -mindepth 1 -maxdepth 1 -exec mv -t.. -- {} +
Длинный ответ:
Команда
mv * .* ..
не будет работать, так как .* может совпадать . и .. Но команда
mv * .[^.]* ..
также не будет работать, так как .[^.]* не будет совпадать, например, ..filename ! Вместо этого я делаю
mv * .[^.] .??* ..
который будет соответствовать всем, кроме . и .. * будет соответствовать всему, что не начинается с . .[^.] будет соответствовать всем 2-х символьным именам файлов, начинающимся с точки, кроме .. , и .??* будет соответствовать всем именам файлов, начинающимся с точки минимум с 3 символами.
А еще лучше, вы можете использовать
find . -mindepth 1 -maxdepth 1 -exec mv -t.. -- {} +
что позволяет избежать уродливых хакерских взломов в mv * .[^.] .??* .. !
Ради полноты можно также указать оболочке 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 .
Правильнее использовать шаблон * .[!.] .??* чем * .[^.] .??* поскольку первый также будет работать со старыми оболочками, такими как ksh88:
mv -- * .[!.] .??* ..
-- предотвращает проблемы, когда у вас есть имя файла, которое начинается с -* соответствует всем именам файлов, которые не начинаются с .. который вы можете / должны двигаться.[!.] соответствует всем двухсимвольным именам файлов, которые начинаются с ..??* соответствует всем трёхсимвольным именам файлов (или длиннее), которые начинаются с .С ksh88, шаблон имени файла .[^.] будет фактически соответствовать именам файлов .. (которые всегда существуют) и .^ (которые, вероятно, не существуют), что будет иметь эффект, противоположный тому, что требуется.
Эта свернутая команда работает на большинстве современных оболочек:
\mv -- {,.{[^.],??}}* ..
В противном случае упоминается портативное решение:
\mv -- * .[^.] .??* ..
Особенности:
\ предотвращает нежелательное изменение псевдонимов.
- предотвращает интерпретацию имен файлов, содержащих начальные дефисы (-xyz), в качестве аргументов командной строки.
. [^.] соответствует всем двухсимвольным именам файлов, начинающимся с. Кроме ..
.??* соответствует всем другим именам файлов, три символа или более.
Наивные реализации:
Следующее пропускает скрытые имена файлов UNIX, начинающиеся с. (.Bashrc).
mv * ..
Следующее совпадение .. которое рекурсивно пытается переместить каждый каталог в конце концов обратно в / в .. текущего рабочего каталога ($ PWD или pwd). Никогда не используйте.
mv .* ..
В конечном итоге пытается mv . потерпит неудачу, потому что mv не сможет отсоединить каталог, в котором вы сейчас находитесь.  Вы могли бы mv * .. переместить файлы в cwd.
mv * .??* ../.
* получает все файлы без точек. .??* получает все. файлы длиной не менее трех байтов, что работает для всех допустимых. Все , что осталось вы , вероятно , хотите rm , а не mv в любом случае.
../. не предлагает никаких прямых преимуществ по сравнению с .. но при перемещении в каталог это очень хорошая привычка, потому что он потерпит неудачу, как вам захочется, если что-то не так с путем. Например, mv xyz bletch , где вы думаете, что bletch - это каталог, можно сделать более уверенным с помощью mv xyz bletch/. , 
Найти и 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 .