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

50

У меня куча папок в папке A. Я хочу переместить файлы из всех этих папок в A.

Или же

Я хочу вырезать все файлы из дочерних папок и вставить их в родительскую папку.

Как это сделать?

Рахул Вирпара
источник
1
Я на самом деле не проверял, чтобы это было надежно или что-то в этом роде, но вы пытались просто ввести эту команду из папки A в терминале mv */* .:?
Марти Фрид
Вы уверены, что нет повторяющихся имен файлов?
Джиппи
mv */* .не будет перемещать файлы из подпапки подпапок.
Рахул Вирпара
@jippie Да, повторяющихся имен нет
Рахул Вирпара

Ответы:

83

Перейдите в свой Aкаталог и запустите

find . -mindepth 2 -type f -print -exec mv {} . \;

что означает «найти все файлы в этом каталоге и его подкаталогах и выполнить mv с целевым каталогом. для каждого найденного файла переместить их в текущий каталог.

Tuminoid
источник
1
он также пытается переместить файлы, которые уже находятся в родительском каталоге.
Рахул Вирпара
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.), Например, и вставьте в него следующее, предполагая, что:

  1. Вы хотите сделать это рекурсивно (в подпапках и подпапках этих подпапок)
  2. Вы хотите пропустить перемещение файла скрипта
  3. У вас есть права на перемещение файлов в этой папке
  4. Файлы могут включать или не включать пробелы в своих именах

find * -type f -print -not -type d -and -not -regex 'cutme' -exec mv {} .. \;

Обратите внимание на название cutme внутри строки. Он должен быть таким же, как скрипт, который вы запустите.

После создания файла и вставки вышеуказанной строки запустите следующее в той же папке, что и скрипт:

chmod +x cutme, Это даст новый файл флаг «исполняемый файл» , так что вы можете выполнить это следующим образом : ./cutme.

Луис Альварадо
источник
Почему я должен пытаться переместить файлы, которые уже находятся в родительском каталоге?
Рахул Вирпара
Вы бы запустить скрипт из папки. Каждый файл в нем, если он находится внутри подпапки или нет, будет перемещаться в родительскую папку папки. Родительская папка здесь является родительской по отношению к сценарию. Фактически, изменив последние 2 точки, вы можете указать, куда перемещать все файлы в папке, в которой вы запускаете скрипт.
Луис Альварадо