(Bash) Расширение переименования файлов

Чтобы избежать проблем с цитированием, вы можете передавать аргументы в base64 и декодировать их на сервере Linux. .

Но зачем создавать собственный api там, где есть SSHFS? см. справку по следующей ссылке

https://www.digitalocean.com/community/tutorials/how-to-use-sshfs-to-mount-remote-file-systems-over-ssh

2
15.09.2017, 21:24
1 ответ
for name in /hw1/textarchive/*.pro; do
    newname=${name%.pro}.txt
    echo mv "$name" "$newname"
done

или короче,

for name in /hw1/textarchive/*.pro; do
    echo mv "$name" "${name%.pro}.txt"
done

(удалите echo, если уверены, что все работает правильно)

Это перебирает все .proфайлы в /hw1/textarchiveи переименовывает их в .txtфайлы. Замена ${name%.pro}удалит расширение .proв конце имени в $name.


Если вы хотите переименовать все файлы:

for name in /hw1/textarchive/*; do
    echo mv "$name" "${name%.*}.txt"
done

${name%.*}удалит любое расширение в конце имени. Существующие файлы .txtтакже будут обработаны, но их имена не изменятся. Файлы без расширения получат новое расширение .txt. Это также подберет имена не -файлов (, таких как каталоги ),поэтому следующее изменение пропустит эти:

for name in /hw1/textarchive/*; do
    test -f "$name" || continue
    echo mv "$name" "${name%.*}.txt"
done

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

for name in /hw1/textarchive/*; do
    test -f "$name" || continue
    test -e "${name%.*}.txt" && continue
    echo mv "$name" "${name%.*}.txt"
done

О другой эквивалентной форме:

for name in /hw1/textarchive/*; do
    if [ -f "$name" ] && [ ! -e "${name%.*}.txt" ]; then
        echo mv "$name" "${name%.*}.txt"
    fi
done

Тест -fпроверяет существование заданного обычного файла. Тест -eпроверяет существование заданного имени (независимо от того, какое это имя ).

Для этого решения не требуетсяbash(толькоsh-совместимая оболочка ).

3
27.01.2020, 22:03

Теги

Похожие вопросы