как убрать только ext3 здесь в unix? filename.ext1.ext2.ext3 - PullRequest
0 голосов
/ 02 сентября 2011

пример файла: filename.ext1.ext2.ext3 как удалить только ext3 здесь в оболочке Unix Bash под Sun Solaris? во всех каталогах:

find . -name "*.ext3" |  mv '{}' ?

Ответы [ 2 ]

3 голосов
/ 02 сентября 2011

Вы можете направить вывод команды find в цикл while read. Таким образом, даже имена файлов с пробелами будут прочитаны правильно. Не используйте for file in $(find ...) конструкцию. Это очень неэффективно (поиск должен завершиться до запуска цикла for, у него будут проблемы с файлами с пробелами в имени, и он может перегрузить буфер командной строки, что произойдет без малейшего указания.

Вы также можете использовать конструкцию $[var%name}. % означает маленький правый фильтр. Он фильтрует правую часть переменной окружения с помощью соответствующего глобуса. Одно % означает соответствие наименьшей возможной суммы. Двойное %% означает совпадение с наибольшей суммой. # и ## для левой стороны строки.

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

find . -type f -name "*.ext3" | while read file
do
   mv "$file" "${file%.ext3}" 
done

Немного безопаснее было бы использовать find . -name "*.exe" -print0, который разделяет имена файлов с нулями вместо возвратов. Это полезно, если в названии файла есть. Затем вы должны установить переменную IFS для обработки нулей, а не пробелов, табуляции и NL.

2 голосов
/ 02 сентября 2011

Это будет:

for i in `find . -type f -name "*.ext3"` ; do mv $i $(echo $i | sed -e '/\.ext3$//') ; done

В случае, если файлы имеют пробелы, вы можете сделать это немного по-другому:

find . -type f -name "*.ext3" | while read file ; do mv "$file" "$(echo $file | sed -e '/\.ext3$//')" ; done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...