Я на самом деле не проверял, чтобы это было надежно или что-то в этом роде, но вы пытались просто ввести эту команду из папки A в терминале mv */* .:?
Марти Фрид
Вы уверены, что нет повторяющихся имен файлов?
Джиппи
mv */* .не будет перемещать файлы из подпапки подпапок.
Рахул Вирпара
@jippie Да, повторяющихся имен нет
Рахул Вирпара
Ответы:
83
Перейдите в свой Aкаталог и запустите
find .-mindepth 2-type f -print -exec mv {}. \;
что означает «найти все файлы в этом каталоге и его подкаталогах и выполнить mv с целевым каталогом. для каждого найденного файла переместить их в текущий каталог.
он также пытается переместить файлы, которые уже находятся в родительском каталоге.
Рахул Вирпара
virpara: теперь эта ваша версия забывает все файлы в каталогах .dot. Вместо этого измените его с -mindepth 2 для подавления предупреждений.
Туминоид
1
С GNU findвы можете быть немного более элегантным и не создавать mvпроцесс для каждого файла:find A -mindepth 2 -type f -exec mv -t A \{\} +
Дэвид Фёрстер
Дэвид, ваша версия работает до тех пор, пока вы не достигнете предела максимальной длины командной строки, что не так сложно сделать, учитывая, как find распечатывает пути, особенно в случае, когда вы вызываете ее из каталога, отличного от A, как в вашем примере.
Туминоид
9
Это очень опасно. если у вас есть файлы с одинаковыми именами в разных подпапках, вы перезапишете их с последним поиском. Лучше использовать mv с --backup = numbered:find . -mindepth 2 -type f -print -exec mv --backup=numbered {} . \;
pLumo
4
Хорошо, вы можете создать файл и назвать его «cutme» (чтобы создать файл с именем cutme в типе терминала nano cutme. Чтобы сохранить его, нажмите CTRL + X, затем нажмите ENTER.), Например, и вставьте в него следующее, предполагая, что:
Вы хотите сделать это рекурсивно (в подпапках и подпапках этих подпапок)
Вы хотите пропустить перемещение файла скрипта
У вас есть права на перемещение файлов в этой папке
Файлы могут включать или не включать пробелы в своих именах
find * -type f -print -not -type d -and -not -regex 'cutme' -exec mv {} .. \;
Обратите внимание на название cutme внутри строки. Он должен быть таким же, как скрипт, который вы запустите.
После создания файла и вставки вышеуказанной строки запустите следующее в той же папке, что и скрипт:
chmod +x cutme, Это даст новый файл флаг «исполняемый файл» , так что вы можете выполнить это следующим образом : ./cutme.
Почему я должен пытаться переместить файлы, которые уже находятся в родительском каталоге?
Рахул Вирпара
Вы бы запустить скрипт из папки. Каждый файл в нем, если он находится внутри подпапки или нет, будет перемещаться в родительскую папку папки. Родительская папка здесь является родительской по отношению к сценарию. Фактически, изменив последние 2 точки, вы можете указать, куда перемещать все файлы в папке, в которой вы запускаете скрипт.
mv */* .
:?mv */* .
не будет перемещать файлы из подпапки подпапок.Ответы:
Перейдите в свой
A
каталог и запуститечто означает «найти все файлы в этом каталоге и его подкаталогах и выполнить mv с целевым каталогом. для каждого найденного файла переместить их в текущий каталог.
источник
find
вы можете быть немного более элегантным и не создаватьmv
процесс для каждого файла:find A -mindepth 2 -type f -exec mv -t A \{\} +
find . -mindepth 2 -type f -print -exec mv --backup=numbered {} . \;
Хорошо, вы можете создать файл и назвать его «cutme» (чтобы создать файл с именем cutme в типе терминала
nano cutme
. Чтобы сохранить его, нажмите CTRL + X, затем нажмите ENTER.), Например, и вставьте в него следующее, предполагая, что:find * -type f -print -not -type d -and -not -regex 'cutme' -exec mv {} .. \;
Обратите внимание на название cutme внутри строки. Он должен быть таким же, как скрипт, который вы запустите.
После создания файла и вставки вышеуказанной строки запустите следующее в той же папке, что и скрипт:
chmod +x cutme
, Это даст новый файл флаг «исполняемый файл» , так что вы можете выполнить это следующим образом :./cutme
.источник