Я пытаюсь использовать следующую команду:

find . -type d -name "2016*" -exec mv {}/* ../../../Pictures/2016/ \;

Чтобы переместить все файлы в любой папке, начиная с 2016 года, в другую папку с именем Pictures/2016. Это не дает файл /каталог найден, однако echoing дает это:

mv ./2016-02-13/* ../../../Pictures/2016/

Есть идеи, умные люди из Stack Exchange?

1 ответ1

1

Использование подоболочек с find

* Будет расширен вашей оболочкой до того, как find увидит, так что это неправильно - это может даже привести к потере данных. Вы не можете процитировать это, потому что тогда это не будет расширено вообще.

Что вам нужно, это подоболочка, которая получает папку в качестве аргумента, а затем выполняет расширение позже:

find . -type d -name '2016*' -exec sh -c 'mv -- "$0"/* /path/to/target/' {} \;

-- предотвращают файлы с запуском - от интерпретируются как mv вариантов, и вы должны экранируете имя папки в "$0"

Используя чистый Bash

Альтернативное использование рекурсивного сглаживания с помощью Bash ≥ 4.0:

shopt -s globstar
mv **/2016*/* /path/to/target/

Я предполагаю, что это намного чище, хотя это ломает слишком большое количество файлов.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .