以下のスクリプトをMYFILESディレクトリに保存してxファイルを作成し、そのタイムスタンプが数年と数ヶ月にわたってランダムに実行されるようにしました。
for i in {1938..2037}; do
## create a file with a random month
touch -d "${i}-$((RANDOM % 12 + 1))-01" file_$((i-1937))
done
output:
-rw-r--r-- Users 0 Jul 1 1938 file_1
-rw-r--r-- Users 0 Jun 1 1947 file_10
-rw-r--r-- Users 0 Oct 1 2037 file_100
MYFILESディレクトリの内容を分析し、サブディレクトリFILES2のファイルをソートしてから、タイムスタンプに基づいてファイル名を変更するスクリプトを作成する方法を学びます。
出力例は次のようになります。
rw-r--r-- Users 0 Jul 1 1938 file_JUL1938
rw-r--r-- Users 0 Jun 1 1947 file_JUN1947
rw-r--r-- Users 0 Oct 1 2037 file_OCT2037
答え1
情報を収集して反転するには、GNUの日付と統計を使用してください。
for f in *
do
ref=$(stat -c %y "$f" | awk '{print $1}')
mon=$(date -d "$ref" +%b)
year=$(date -d "$ref" +%Y)
echo mv -- "$f" "file_${mon^^}${year}"
done
これは bashism を使用して月を大文字で表示します。使用できない場合は使用してくださいecho "$mon" | tr '[:lower:]' '[:upper:]'
。別のオプションは、最も近い日付関数を使用して月の大文字のバージョンを返すことですdate +%^b
。
サンプルファイルを生成するには:
touch -d 1938-07-01 file_1
touch -d 1947-06-01 file_10
touch -d 2037-10-01 file_100
サンプル入力のスクリプト出力:
mv -- file_1 file_JUL1938
mv -- file_10 file_JUN1947
mv -- file_100 file_OCT2037
答え2
ls -l file_* |
awk '{system("echo mv -v -- " $9 " file_" toupper($6) $8);}'
実際のファイル名を変更するには、echo
この単語を削除する必要があります。
説明する
ls -l file_* | awk
- すべてのファイルを一覧表示して送信しますawk
。system()
- シェルコマンドを実行します。mv -v -- " $9 " file_" toupper($6) $8
-mv
mv
-シェルで実行される一般的なコマンド。toupper(str)
- 文字列のコピーを返します。ステル、ここですべて小文字ステル対応する大文字に翻訳されました。$6
- 月:8月、7月、2月$8
- 年: 1938年、1947年、2037年。$9
- ファイル名:file_1、file_10、file_100。
文書
$ ls -l file_*
-rw-rw-r-- 1 user user 0 Aug 1 1938 file_1
-rw-rw-r-- 1 user user 0 Jul 1 1947 file_10
-rw-rw-r-- 1 user user 0 Feb 1 2037 file_100
出力
mv -v -- file_1 file_AUG1938
mv -v -- file_10 file_JUL1947
mv -v -- file_100 file_FEB2037