2015-12-04 8 views
0

Я хочу написать сценарий, который добавляет '0' в конце файлов, которые его не имеют.Переименование файлов в каталоге самый простой способ в скрипте

Это то, что я писал:

#!/bin/bash 
for file in $1 
do 
    echo $file 

    ls $file | grep "\0$" 

    if ["$?"="1"] 
    then 

    fi 

done 

Я не знаю горячего целевые файлы в способе, которым я могу переименовать их

ответ

1
for file in *[!0]; do mv "$file" "${file}0"; done 

Для каждого имени, которое не заканчивается 0, переименуйте его так, как надо. Обратите внимание, что в них обрабатываются имена с пробелами и т. Д.


Я хочу дать скрипт каталога, и он будет переименовать файлы в нем, которые не заканчиваются в 0. Как я могу использовать это таким образом, я могу сказать, сценарий, какой каталог для работы с?

Таким образом, сделать тривиальные необходимые изменения, работая с одной директорией (и не отвергая командную строку, если более чем один каталог задан, просто спокойно игнорируя массовку):

for file in "${1:?}"/*[!0]; do mv "$file" "${file}0"; done 

"${1:?}" нотация гарантирует, что $1 установлен и не пуст, генерируя сообщение об ошибке, если это не так. Вместо этого вы можете вместо этого записать "${1:-.}"; который будет работать с текущим каталогом, а не с удаленным каталогом. Затем glob генерирует список имен файлов в этом каталоге, который не заканчивается 0, и переименовывает их так, чтобы они выполнялись. Если у вас есть Bash, вы можете использовать shopt -s nullglob, вы не столкнетесь с проблемами, если в каталоге нет файлов без суффикса 0.

Вы можете обобщать обрабатывать любое количество аргументов (все должны быть каталоги, по умолчанию в текущем каталоге, если не указан каталог):

for dir in "${@:-.}" 
do 
    for file in "$dir"/*[!0]; do mv "$file" "${file}0"; done 
done 

или (заставляющие каталоги):

for dir in "${@:-.}" 
do 
    (cd "$dir" && for file in *[!0]; do mv "$file" "${file}0"; done) 
done 

Это имеет смысл сообщить, какие аргументы не являются каталогами или недоступными каталогами.

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


Теперь я хочу сделать то же самое, но вместо этого файла, заканчивающейся «0», скрипт должен переименовать файлы, которые не заканчиваются «.0» так, что они заканчиваются ".0 «?

Это немного сложнее из-за пересмотренного финала. Недостаточно просто использовать [!.][!0]. Например, если список файлов включает 30, x.0, x0, z.9 и z1, то echo *[!.][!0] только списки z1 (опуская 30, x0 и z.9, которые не заканчиваются с .0).

я бы, вероятно, использовать что-то вроде этого, вместо:

for dir in "${@:-.}" 
do 
    (
    cd "$dir" && 
    for file in * 
    do 
     case "$file" in 
     (*.0) : skip it;; 
     (*) mv "$file" "${file}0";; 
     esac 
    done 
    ) 
done 

Другие альтернативные списки более GLOB моделей:

for dir in "${@:-.}" 
do 
    (cd "$dir" && for file in *[!.][!0] *.[!0] *[!.]0; do mv "$file" "${file}0"; done) 
done 

Обратите внимание, что это быстро становится намного сложнее, если вы хотите, чтобы искать файлы не заканчиваются .00 - было бы 7 выражений глобуса (но вариант case будет работать одинаково прямолинейно), а shopt -s nullglob становится все более важным (или вам нужно [ -f "$file" ] && mv "$file" "${file}.0" вместо o f более простая команда перемещения).

+0

Как я могу использовать это так, чтобы я мог сказать скрипту, какой каталог работать? – hydrz

+0

Он работает. Теперь я хочу сделать то же самое, но вместо «0» с «.0». Сценарий не распознает файл с именем 30. Я предполагаю, что это потому, что «.» работает как своего рода подстановочный знак, заменяя «3»? – hydrz

+0

Итак, вы хотите переименовать файлы, которые не заканчиваются на '.0', чтобы они заканчивались' .0'? Это нерешительно, потому что шаблон распознавания является fiddlier. Пожалуйста, подтвердите, что я правильно интерпретировал ваше требование (комментарий ответа). –

Смежные вопросы