
ファイルセットの名前を変更するスクリプトを作成しようとしています。通常TIFですが、時には奇妙なことが起こる可能性があるので、ファイル名を変更してファイル拡張子を無視したいと思います。
ファイル名はすべて同じで、エポック時間が差別化要素として追加されました。最終結果は次のようになります。
Name1=CLMSFILE
Name2=Epoch
Name3=_A BUNCH OF OTHERTEXT_WITH_A_MIXTURE OF UNDERSCORES AND_SPACES
CLMSFILE53253_A BUNCH OF OTHERTEXT_WITH_A_MIXTURE OF UNDERSCORES AND_SPACES.TIF (or other extension)
これが私が現在持っているものです。
#Rename files and insert epoch time
name1=$CLMSFILE
name2=$(date +%s%3N)
name3=$_A\ BUNCH\ OF\ OTHERTEXT_WITH_A_MIXTURE\ OF\ UNDERSCORES\ AND_SPACES
for f in *; do
newname=$name1$name2$name3
mv -n "$f" "${newname}"
done
このコマンドを実行した後、最初のファイルの名前のみを変更しましたが、最初の変数は無視され、拡張子はありません。
1653049404956 _A BUNCH OF OTHERTEXT_WITH_A_MIXTURE OF UNDERSCORES AND_SPACES
220220217SOMEORG20003_01.TIF
220220217SOMEORG30004_01.TIF
答え1
シェルスクリプトには、観察されたエラーを引き起こすいくつかの問題があります。
あなたの名前の一部はbeです
CLSMFILE
。ただし、宣言した変数の割り当てでは、name1=$CLMSFILE
最初の部分に内容を割り当てます。名前付きシェル変数CLSMFILE
、存在しないので空になる可能性があります。その部分についても実際には同じですが、name3
文字列をで始めると_
シェル$_
で特別な意味があるため、解釈はすぐに停止し、_
文字列の残りの部分は変更されずに変数にインポートされます。スクリプトは、すべてのファイルの名前を同じ名前に変更しようとします。幸いにも、そのオプションを使用しました
-n
。それ以外の場合は、ディレクトリ内の最後のファイルを除くすべてのファイルが失われた可能性があります。その理由は、
date
コマンドがname2=$(date ...)
評価されるからです。$name2
変数を使用するたびにではなく、代入するとき。したがって、ループのすべての反復に対して一定です。私はファイル拡張子が欲しいと言いましたが、ファイルに拡張子を追加するのを忘れました。
mv
名前変更フルファイル名これは、前の部分だけでなく、.
ファイル名に複数が許可されるためです。.
私はあなたが使用することをお勧めしますshellcheck
、シェルスクリプトでエラーをキャッチするためのスタンドアロンツールとしても使用できます。
次の修正が適用されます。
name1="CLMSFILE"
name3="_A BUNCH OF OTHERTEXT_WITH_A_MIXTURE OF UNDERSCORES AND_SPACES"
for f in *; do
basename=${f%.*}
newbasename="$name1$(date +%s%3N)$name3"
newname=${f/$basename/$newbasename}
mv -n "$f" "${newname}"
done
これはシェル文字列操作を使用して
- "basename"部分
$f
(つまり、最後に区切られた部分より前のすべての項目.
)を変数に保存します。$basename
- ルールに従って新しいデフォルト名を生成しますが、
date
ループの繰り返しごとにコマンドを実行してください。 $basename
部分文字列を$f
次に置き換える$newbasename
- それに応じてファイル名を変更してください。
mv -n ...
理想的には、部品を同様のものに置き換えることができます。
echo "Renaming '$f' to '$newname'"
名前生成ロジックが正しく機能していることを確認するまで。