Переименовать имена файлов в текущем каталоге и во всех подкаталогах - PullRequest
1 голос
/ 04 января 2011

У меня есть 4 файла со следующими именами в разных каталогах и подкаталогах

tag0.txt, tag1.txt, tag2.txt and tag3.txt 

и я хочу переименовать их как tag0a.txt, tag1a.txt ,tag2a.txt and tag3a.txt во всех каталогах и подкаталогах.

Может ли кто-нибудь мне помочьиспользовать сценарий оболочки?

Приветствия

Ответы [ 5 ]

3 голосов
/ 04 января 2011

Конечно, это можно сделать с помощью команды find:

find . -name 'tag?.txt' -type f -exec bash -c 'mv "$1" ${1%.*}a.${1##*.}' -- {} \;
3 голосов
/ 04 января 2011
$ shopt -s globstar
$ rename -n 's/\.txt$/a\.txt/' **/*.txt
foo/bar/tag2.txt renamed as foo/bar/tag2a.txt
foo/tag1.txt renamed as foo/tag1a.txt
tag0.txt renamed as tag0a.txt

Удалите -n, чтобы переименовать после проверки результата - это опция «пробного запуска».

1 голос
/ 04 января 2011

Использование версии сценария Perl rename, которая может быть в вашей системе:

find . -name 'tag?.txt' -exec rename 's/\.txt$/a$&/' {} \;

Использование двоичной исполняемой версии rename:

find . -name 'tag?.txt' -exec rename .txt a.txt {} \;

, которая изменяетпервое появление ".txt".Поскольку имена файлов ограничены аргументом -name, это не будет проблемой.

1 голос
/ 04 января 2011

Вот скрипт оболочки posix (проверяется тире):

visitDir() {
    local file
    for file in "$1"/*; do
            if [ -d "$file" ]; then
                    visitDir "$file";
            else
                    if [ -f "$file" ] && echo "$file"|grep -q '^.*/tag[0-3]\.txt$'; then
                            newfile=$(echo $file | sed 's/\.txt/a.txt/')
                            echo mv "$file" "$newfile"
                    fi
            fi

    done
}

visitDir .

Если вы можете использовать bashisms, просто замените внутренний IF на:

if [[ -f "$file" && "$file" =~ ^.*/tag[0-3]\.txt$ ]]; then
    echo mv "$file" "${file/.txt/a.txt}"
fi

Сначала убедитесь, чторезультат, который вы ожидали, затем, возможно, удалите «echo» перед командой mv.

0 голосов
/ 04 января 2011

Это достаточно хорошо?


jcomeau@intrepid:/tmp$ find . -name tag?.txt
./a/tag0.txt
./b/tagb.txt
./c/tag1.txt
./c/d/tag3.txt
jcomeau@intrepid:/tmp$ for txtfile in $(find . -name 'tag?.txt'); do \
 mv $txtfile ${txtfile%%.txt}a.txt; done
jcomeau@intrepid:/tmp$ find . -name tag*.txt
./a/tag0a.txt
./b/tagba.txt
./c/d/tag3a.txt
./c/tag1a.txt

На самом деле не ставьте обратную косую черту в команде, и если вы это сделаете, ожидайте приглашение «>» на следующей строке. Я не включил это в вывод, чтобы избежать путаницы, но я не хотел, чтобы кто-либо тоже прокручивал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...