bash for ループでコマンド置換を使用する

bash for ループでコマンド置換を使用する

明らかなミスをしたかもしれませんが、強力なヒントを使用することができました:-)

for file in *; do ls $file | var=$(ls $file | grep -Eo '.{18}$' | cut -d '.' -f1 |sed 's/.\{12\}/&./'); echo "var is $var. File is $file";done

結果: $var が空です。 $fileはそうではありません。$varが空なのはなぜですか?

テスト文字列を手動で$ fileに入れて、次のように実行すると、$ varに私が欲しいものが含まれます。

var=$(ls $file | grep -Eo '.{18}$' | cut -d '.' -f1 |sed 's/.\{12\}/&./')

だから、この問題を引き起こすforループに関する何かがあります。 $var変数には、次の文で使用できないようにする範囲制限があるようです。

幸せなイースターを送ってください:-)

完全な例:

質問によると、ここに私の疑いを明確にする例があります。ファイルの日付はinventory_a_test-20190605161153.txt1ファイル名の日付と一致する必要があります。まず、ファイルを間違った日付に設定しました。

$ touch inventory_a_test-20190605161153.txt
$ ls -l --full-time inventory_a_test-20190605161153.txt
-rw-rw-r-- 1 root root 0 **2021-04-05** 15:02:05.000000000 +0200 inventory_a_test-20190605161153.txt

ここで、日付を修正するために、bashのforループで以下のようなコマンドフローを作成したいと思います。

$ file=inventory_a_test-20190605161153.txt
$ ls $file | grep -Eo '.{18}$' | cut -d '.' -f1 |sed 's/.\{12\}/&./'
201906051611.53
$ touch -a -m -t 201906051611.53 $file
$ ls -l --full-time inventory_a_test-20190605161153.txt
-rw-rw-r-- 1 root root 0 **2019-06-05** 16:11:53.000000000 +0200   inventory_a_test-20190605161153.txt

ベストアンサー1

この部分は言葉ではありません:

ls $file | $(something)

この$(command)形式は、「実行commandと出力を変数として扱う」を意味します。これはパイプ入力を受け入れることができません。私は何が恋しいですか?意味は書かれた内容は次のとおりです。

for file in *; do 
    var=$(ls "$file" | grep -Eo '.{18}$' | cut -d '.' -f1 |sed 's/.\{12\}/&./'); 
    echo "var is $var. File is $file"
done

しかし、奇妙なファイル名のため、これは悲惨に失敗します。実際に出力を解析したくありません。ls。しかもlsここでは全く必要ありません!あなたは持つファイル名がlsより複雑になり、エラーが発生する可能性があります。これにより、目的のタスクが実行されます。

for file in *; do
    timestamp=$(sed -E 's/.*(.{12})(..)\.[^.]*$/\1.\2/' <<<"$file")
    touch -a -m -t "$timestamp" -- "$file"
done

sedファイルの最後の拡張子の前の最後の14文字のみを印刷します(ファイル名の最後まで一致し、0以上に\.[^.]*$/一致します)。ただし、最後の2文字を最初の12文字から分離して効果的に生成します。あなたのタイムスタンプ。...

おすすめ記事