100 個のフォルダがあり、各フォルダには次の名前のファイルが 1 つまたは 2 つあります。
XXX_001_014_max.jpg
XXX_001_024_max.jpg
フォルダ名を「list.txt」ファイルに保存します。
フォルダ内のファイル名をすぐに変更するには、次のコードを実行します。
#!/bin/bash
for i in $(cat list.txt); do
mv ${i}/XXX_001_014_max.jpg ${i}/image.jpg
done
私の目標はファイル名をXXX_001_014_max.jpg
に変更することです。ファイルが存在しない場合(つまり、フォルダ内にファイルが1つしかない場合)、2番目のファイルの名前を次のように変更するimage.jpg
ようにコードが必要です。XXX_001_024_max.jpg
image.jpg
コマンドを使用してファイルの名前を変更する方法を知っていますが、この場合、ステートメントの正確な使い方はmv
わかりません。if
答え1
このfor i in $(cat squeeze)
設定を避けてください。ディレクトリ名に次のものが含まれていると失敗します。IFS文字...
行を配列として読み、各ディレクトリの最初のファイル名を変更します。あなたが〜した後常に1つまたは2つのファイルがあります各ディレクトリ内で、これは各ディレクトリ内の最初のディレクトリの名前を変更したときに操作を実行する必要があることを意味しますbash
。たとえば、次のようになります。
mapfile -t mylist <list.txt
for i in "${mylist[@]}"
do
set -- "$i"/*
echo mv -- "$1" "$i"/image.jpg
done
set --
echo
結果が満足であれば削除してください。
答え2
if [ -f XXX_001_014_max.jpg ]
then
SOURCE=XXX_001_014_max.jpg
else
SOURCE=XXX_001_024_max.jpg
fi
mv $SOURCE image.jpg
答え3
if [ -f XXX_001_014_max.jpg ]
then
mv XXX_001_014_max.jpg image.jpg
else
mv XXX_001_024_max.jpg image.jpg
fi