Использование * для разбора файлов. Нужно написать имена файлов - PullRequest
0 голосов
/ 04 марта 2012

У меня следующая проблема с использованием команд UNIX. Я хочу просмотреть большое количество файлов и конвертировать их с помощью команды, которая конвертирует их. Моя идея такова: command *.fileending > *.newfileending

Проблема в том, что Я хочу сохранить имена файлов и заменить только окончание файла . Таким образом, filename.fileending должно стать filename.newfileending. Как мне этого добиться?

Ответы [ 3 ]

3 голосов
/ 04 марта 2012

Используйте цикл for:

for file in *.krn; do
  hum2mid "$file" -o "${file%.krn}.mid"
done

В одну строку: for file in *.krn; do hum2mid "$file" -o "${file%.krn}.mid"; done


Чтобы рекурсивно применить команду к файлам и подкаталогам, используйте шаблон find|xargs:

find -type f -name '*.krn' -print0 \
  | xargs -0 -n1 sh -c 'hum2mid "$1" -o "/destination/dir/$(basename ${1%.krn}.mid)"' -

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

0 голосов
/ 04 марта 2012
#!/bin/bash
ls -1 *.fileending  | while read i; do
  command "$i" > "${i/%.fileending/.newfileending}"
done

если вам нужно обработать «странные» имена файлов (например, с помощью встроенного '\ n'), вы можете использовать следующий прием:

создать файл foo.sh:

#!/bin/bash
command "$1" > "${1/%.fileending/.newfileending}"

, затем выполните chmod +x foo.sh и, наконец, find . -maxdepth 1 -a -type f -a -name '*.fileending' -print0 | xargs -0 -n 1 -J '%' ./foo.sh "%"

0 голосов
/ 04 марта 2012
rename .fileending .newfileending *
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...