1

У меня есть довольно много файлов с разными расширениями, которые находятся в подпапках типа «aaa»

/f1/aaa/a.txt
/f1/aaa/a.sql
/f1/f2/aaa/b.txt
/f1/f2/aaa/b.csv

мне нужно извлечь все эти файлы из /f1 и удалить только их расширения:

/f1/aaa/a
/f1/f2/aaa/b

1 ответ1

1

Если под "извлекать и удалять их расширения" вы имеете в виду переименование их по ходу дела, этого можно достичь.

find f1 -path "*/aaa/*" -type f -exec bash -c 'mv -i -- "$0" "${0%.*}"' {} \;

Или просто напечатать файлы без их расширения:

find f1 -path "*/aaa/*" -type f -exec bash -c 'echo "${0%.*}"' {} \;

Вместо того, чтобы grep find , вы должны использовать встроенные возможности фильтрации, чтобы найти подходящие файлы. В противном случае вы получите ложные срабатывания для файлов, включая строку aaa .

Подстановки имен файлов всегда должны заключаться в кавычки, чтобы предотвратить расширение пробелов или шаблонов оболочки.

Более того, выходные данные find не должны передаваться в while пока вы не разметите результат как null. Если вы на самом деле просто хотите «что-то сделать» с каждым файлом, while в этом случае нет необходимости. Тот же эффект может быть достигнут с помощью опции -exec .

Если вам нужно find … | while то время , тогда это безопаснее (не забудьте процитировать имя файла):

find … -print0 | while IFS= read -r -d '' file; do command "$file"; done

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