Рекурсивное перемещение файлов определенного типа по определенному пути

3863
macek

В ~ / my / path я хочу переместить все файлы, содержащие строку "(J)" и тип файла ".foo", в ~ / my / path / j

Я пытаюсь:

[me ~/my/path]$ find -type f -name "*(J)*.foo" -print0 | xargs mv -0 j/

Неудачно :(

1

3 ответа на вопрос

4
John T

Как насчет

найти ~ / my / path -type f -name "* (J) *. foo" -exec mv {} ~ / my / path / j \;
Это сработало отлично; Спасибо! macek 14 лет назад 0
Не знал, что вы на самом деле хотели скобки вокруг J, просто добавил их. Добро пожаловать. John T 14 лет назад 0
Джон Т., Это решение кажется очень элегантным и эффективным, но мне трудно понять, что на самом деле означает {}. Я понимаю, что "переменная" используется для команды mv, но что еще может сделать {}? И просто для пояснения, \; используется для завершения exec? macek 14 лет назад 0
При использовании `-exec` с` \; `,` {} `заменяется текущим найденным файлом или каталогом, который соответствует вашим критериям. `\;` разветвляет новую операцию `mv` для каждого найденного результата. НТН. John T 14 лет назад 0
3
Dennis Williamson

В -0потребности идти сразу после xargs.

find -type f -name "*(J)*.foo" -print0 | xargs -0 -I{} mv \{\} j/ 

Кстати, размещение сообщения об ошибке или других деталей вместо «не повезло» помогает диагностировать проблемы.

Я тоже попробовал это, и я получил такой вывод: use: mv [-f | -i | -n] [-v] исходная цель mv [-f | -i | -n] [-v] source ... каталог macek 14 лет назад 0
Извините, я забыл вставить фигурные скобки. Исправлено. Dennis Williamson 14 лет назад 0
0
user38328

Как насчет

mv `find -name *(J)*.foo` -t /my/path 
Хотя с этим решением вы можете получить ошибку «список аргументов слишком длинный»; в этом случае предложенный Деннисом работал для меня. user38328 14 лет назад 0