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