タッチ用のスクリプト


1

私はこのような便利なコマンドを見ました:

for f in *; do t=$(echo $f | sed -E 's/[-. mov]//g'); touch -t $t "$f"; done

次の命名規則を持つファイルの「タイムスタンプ」文字列のみを保持するために、そのコマンドで何を変更する必要がありますか?

aaaa@XXXXXX(XXXXXXX)_20170201101315.mp3

どのような種類の文字の中に実際にあるaaaa@XXXXXX(XXXXXXX)、その後、他の@()しているa...X...アルファのみ文字や英数字?さらに、誤って別の質問への回答として投稿したあなたの削除された質問を見ましたが、同じこと、つまりtouch日時スタンプを変更するファイルを実行したいですか?(ちょうどそれがあなたが望んでいることを確認したいです。)
user3439894

ええ、それは私です...ファイル名のサンプルは-Chiama @ 800031141(800031141)_20160725093945.mp3であり、スクリプトを実行して、ファイル名に記述されたデータスタンプ値を「TOUCH」に入れたいです。そのデータで作成日と変更日を変更するパラメーター。もちろん、TOUCHパラメーターに秒が必要ないことを除いて、ファイル名の日付番号は正しいはずです。
ジャンキーファンキー

回答:


0

ファイル名が終わり.mp3t変数の長さが処理前に12文字であることをテストしたいという点で、少し異なるアプローチを取ります。これにより、この場合のエラーは致命的ではないはずですが、パターンに準拠していないファイルに作用し、エラーをスローしないようにします。不要なジャンク出力が嫌いです。

これは、スクリプト形式の例です。

#!/bin/bash

for f in *.mp3; do
    t="$(awk '/_.*/ { match($0, /_.*/); print substr($0, RSTART + 1, RLENGTH - 7); }'<<<"$f")"
        if [[ ${#t} -eq 12 ]]; then
            touch -t "$t" "$f"
        fi
done

これは、長いものではありますが、ワンライナーとしてのスクリプトの例です。

for f in *.mp3; do t="$(awk '/_.*/ { match($0, /_.*/); print substr($0, RSTART + 1, RLENGTH - 7); }'<<<"$f")"; if [[ ${#t} -eq 12 ]]; then touch -t "$t" "$f"; fi; done

次のように短縮できます:

for f in *.mp3; do t="$(awk '/_.*/ { match($0, /_.*/); print substr($0, RSTART + 1, RLENGTH - 7); }'<<<"$f")"; [[ ${#t} -eq 12 ]] && touch -t "$t" "$f"; done

さらに短くしたい場合:

for f in *; do t="$(awk '/_.*/ { match($0, /_.*/); print substr($0, RSTART + 1, RLENGTH - 7); }'<<<"$f")"; touch -t "$t" "$f" 2>/dev/null; done

上記の形式の複合コマンドはエラーチェックをtouch行わず、コマンドのエラー出力をリダイレクトするため、画面が乱雑になりません。不正な形式のタッチコマンドは致命的ではないため、この使用例ではこの形式で問題ありません。


完璧に動作し、スクリプトを実行し、数分で数千のファイルのタイムスタンプを回復しました。非常に印象的、ありがとう
ジャンキーファンキー

1

コマンドラインで練習して、動作するsedスクリプトを取得できます。

$ echo "aaaa@XXXXXX(XXXXXXX)_20170201101315.mp3" | sed -e "s/^.*_//g" -e "s/\.mp3$//g"
20170201101315

ファイル名のタイムスタンプには秒が含まれており、touchが受け入れる形式ではないため(秒の前に「。」が必要です)、カットでそれらを除外します:

for f in *; do t=$(echo $f |  sed -e "s/^.*_//g" -e "s/\.mp3$//g" | cut -c -12); echo touch -t $t "$f"; touch -t $t "$f"; done
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.