明らかなミスをしたかもしれませんが、強力なヒントを使用することができました:-)
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文字から分離して効果的に生成します。あなたのタイムスタンプ。.
.
.