forループを使用して複数のサブディレクトリの複数のファイル名を変更する

forループを使用して複数のサブディレクトリの複数のファイル名を変更する

forループを使用して、別のサブディレクトリにある同じ名前のファイル名を変更しようとします。サブディレクトリの名前に応じて名前を変更する必要があります。

Subdirectory1/File.txt
Subdirectory2/File.txt

次のようにする必要があります

Subdirectory1/Subdirectory1.txt
Subdirectory2/Subdirectory2.txt

多くのコマンドを試しましたが、他のエラーが発生しました。フォーラムで見つけた最後のコマンドも機能しませんでした。誰でも私を助けることができますか?

dir="Subdirectory1, Subdirectory2"
declare -i count=1 for file in "$dir"/*.txt; do
mv "$file" "${dir}/${dir} ${count}.txt"
count+=1
done

実行後、次のようになります。

mv: cannot stat ‘/*/*.txt’: No such file or directory

ベストアンサー1

このようなコードを使用できます。

#!/bin/bash

# Loop across the list of directories
for dir in Subdirectory1 Subdirectory2
do
    # Only consider directories
    [ -d "$dir" ] || continue

    # Loop across any files in each directory
    for src in "$dir"/*.txt
    do
        dst="$dir/$dir.txt"
        
        # Only rename a file if it won't overwrite another one
        if [ -f "$dst" ]
        then
            # Refuse to overwrite
            echo "Target file already exists: $dst" >&2
        else
            # If the file already has the right name just skip
            [ -f "$src" ] && [ "$src" != "$dst" ] && mv -f -- "$src" "$dst"
        fi
    done
done

prepareスクリプトを使用してください(と仮定renamethemchmod a+x renamethem。それから./renamethem

ディレクトリリストがforループにハードコードされていることがわかります。この問題をよりエレガントに処理する別の方法があります。コマンドラインにリストを提供できます()。./renamethem Subdirectory1 Subdirectory2この場合は、1行を変更してfor dir in "$@"そのコマンドラインから引数を選択してください。または、配列(リスト)を使用することもできます。または、*現在のディレクトリのすべてのディレクトリを一致させるために使用できます。

おすすめ記事