時間情報に「:」を含むファイル名を変更する方法

時間情報に「:」を含むファイル名を変更する方法

私はLinuxコマンドを学んでいます。

時間情報を含むファイル名を変更すると、タグが自動的に割り当てられます:。この:フラグをどのように変更できますか_

以下はファイル名の例です。更新されたタイミング情報があります。代わりに:名前を付けるには_

ee_Sun_Aug_11_22:20:27_GMT-8_2019.txt

また、次はなぜ動作しませんか?

$ cp /var/log/ee.txt ee_`date`.txt
cp: target `2019.txt' is not a directory

答え1

:ksh93、zsh、bash、mkshシェル(または最新バージョンのbusybox sh)を使用して、現在のディレクトリで名前で終わる1つ以上の文字を含むすべてのファイルを繰り返し、.txt文字:をに変更するには、次のように_します。

for name in ./*:*.txt; do
    newname=${name//:/_}
    mv -i "$name" "$newname"
done

またはより短く、

for name in ./*:*.txt; do
    mv -i "$name" "${name//:/_}"
done

パラメータ置換は値のすべての位置を${name//:/_}変更します(上記のシェルはksh93演算子もサポートします)。:_$name

ファイル名は変更されますが、mv -i新しい名前がすでに使用されていることを確認するメッセージが表示されます。

例として示されているファイル名はee_Sun_Aug_11_22_20_27_GMT-8_2019.txt


注文

cp /var/log/ee.txt ee_`date`.txt

date出力は空白を含む文字列なので機能しません。このスペースはcpあなたがコピーしたいと思うようにします一部ファイルをディレクトリに入れます。したがって、「ディレクトリではない」エラーが発生します。

次はうまくいきます。

cp /var/log/ee.txt "ee_$(date).txt"

バックティックをに変更したためで$(...)はなく、新しい名前を2回引用したため、よりうまく機能します。

これにより、ファイルee_Sun Aug 11 16:57:37 CEST 2019.txt(または類似のファイル)が生成されます。

よりきれいなファイル名を取得するには、date出力形式をより正確に指定することをお勧めします。

cp ee.txt "ee_$(date +"%F_%H-%M-%S").txt"

フォーマット文字列はシステムマニュアル()またはコマンドマニュアルに%F_%H-%M-%S記載されており、対応するディレクティブをサポートしていない限り置き換えることができます。strftime(3)man 3 strftimedateee_2019-08-11_16-59-55.txtdate%F%Y-%m-%d

または、

cp ee.txt "$(date +"ee_%F_%H-%M-%S.txt")"

dateコマンド形式が新しいファイル名を作成するほとんどのタスクを実行するようにします。)

関連情報