bashシェルスクリプトから複数のワイルドカードに変数を拡張するには、mv /renameを使用します。

bashシェルスクリプトから複数のワイルドカードに変数を拡張するには、mv /renameを使用します。

私は、データファイルで指定されたパラメータに基づいて静的フォルダ内のファイルを移動するLinux用のbashシェルスクリプトを作成しました。

私が経験している問題を示すために、スクリプトを再現可能な最小限の例に縮小しました。

#!/bin/bash
while IFS=" " read -r fldr matchStr
do
    perlExp=\'s/^/\\/home\\/test\\/alpha\\/"$fldr"\\//\'
    fullmatchStr=testfile\ -\ "$matchStr"\ -\ *.txt
    rename --verbose "$perlExp" ${fullmatchStr}
done < test.dat

(私は元の代わりにmv使用を開始しましたが、両方のコマンドのrenameいずれかを使用できます。)

スクリプトは、test.dat次の構文で構成されるテキストファイルを読み込みます。

folderName matchStr
...

このファイルの簡単な例test.dat

test001 *.foo.bar
test002 *.foo.baz
test003 bar.*.baz

このデータファイルにワイルドカードが許可され、スクリプトがワイルドカードをサポートすることが重要です。また、ファイル名のスペースをサポートする必要があります。

移動するファイルのファイル名の例:

testfile - linux.foo.bar - 10101010 10101010.txt
testfile - unix.foo.bar - 01010101 10101010.txt
testfile - ubuntu.foo.baz - 10101010 01010101.txt
testfile - debian.foo.baz - 10101010 00000000.txt
testfile - bar.linus.baz - 11111111 01010101.txt

上記のtest.datファイルが与えられたら、これらのファイルを個別に次のフォルダに移動する必要があります。

/home/test/alpha/test001
/home/test/alpha/test001
/home/test/alpha/test002
/home/test/alpha/test002
/home/test/alpha/test003

以下を含むいくつかの関連QAを読みました。

しかし、まだ希望の結果が得られませんでした。エラーは発生しませんでしたが、ファイルは移動されませんでした。

このコードが期待どおりに機能するようにどのように改善できますか?

ベストアンサー1

Perlベースのコードを使用している場合rename(そうです)、Perlコードを書くためにシェル文字列を使用しないことをお勧めします。シェルコードでできることを行うには、Perlコードを直接使用してください。

この場合、ループ内で次のことを行います。

IFS=
target="/home/test/alpha/$fldr/" rename --verbose 's/^/$ENV{target}/' "testfile - "$matchStr" - "*.txt

targetここで置き換えるのは、コマンドに設定した環境変数の値なので、renamePerlコードを使用して簡単に取得できます。また、IFSを空の文字列に設定すると単語の区切りが無効になり、$matchStrワイルドカードを安全に使用できます。 (しかし、ここではおそらく必要ありません。引用符がない項目のみを使用できます。結果である$matchStrため、単語の区切りについて心配する必要はありませんが、IFS=" " read -rタブが含まれていることはほとんどありません...)

おすすめ記事