команда bash для каждого файла в папке

31

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

В настоящее время я делаю переименование /my/data/Andrew.doc в /my/data/Andrew.txt. Я хотел бы сделать это для всех файлов .doc из папки / my / data / и сохранить имя.

Я пробовал несколько версий, но я думаю, что у меня что-то не так в синтаксисе, так как я новичок в Linux.

Роберт
источник
→ чуть более полный и практичный пример: stackoverflow.com/a/43474757/444255
Фрэнк

Ответы:

76

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

Баш за петлю

for f in ./*.doc; do
    # do some stuff here with "$f"
    # remember to quote it or spaces may misbehave
done

С помощью find

У findкоманды есть прекрасная маленькая execкоманда, которая отлично подходит для запуска вещей (с некоторыми оговорками). Найти лучше, чем обычные операции с глобализацией, потому что вы действительно можете отфильтровать выбранные вами файлы. Будьте осторожны с нечетным синтаксисом.

find . -iname '*.doc' -exec echo "File is {}" \;

Обратите внимание, что findэто рекурсивно, поэтому вы можете использовать его -maxdepth 1для сохранения findв текущем рабочем каталоге. -type fможет быть использован для фильтрации обычных файлов.

Если мы просто переименовываем документ в txt ...

renameКоманда SED-как в поиске. Очевидно, что это ничего не сделает для преобразования формата.

rename 's/doc$/txt/' *.doc
Оли
источник
22
for i in *.doc ; do mv "$i" $(echo $i | sed s/doc/txt/) ; done
DIRAVI
источник