条件に応じて、各ディレクトリ内の1つのファイルのみ名前を変更します。

条件に応じて、各ディレクトリ内の1つのファイルのみ名前を変更します。

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.jpgimage.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

関連情報