次のようなパターンに名前が一致するすべてのフォルダーを通過するシェルプログラムを作成します。
Sudo sh Shell.sh pub
スクリプトを実行すると、名前にpub
が含まれるすべてのフォルダーが検索され、変更日が出力されます。この画像のような結果を出力するコードが欲しい: このコードはありますが、期待した結果が得られません。
echo 'the folder '$1' was modified at ';
find -type d -name 'kam*' -exec stat -c '%y %n' '{}' \;
すべてのフォルダーを調べて、テキストecho 'the file '$1' was modified at ';
を出力し、画像のように日付を印刷する必要があります。
次のような結果が欲しい:
netcom@hotspot:~$ bash script.sh testRegex Pub
the folder testRegex was modified on may 15 01:19
the folder Public was modified on may 19 01:19
the folder Pubos was modified on may 19 01:19
find
自体を使用して、すべてを印刷できます。
for pattern
do
find . -type d -name "*$pattern*" -printf 'The folder %P was modified on %t\n'
done
for pattern; do ... done
はすべての引数をループし、pattern
変数を各引数に順番に設定します。
find
、%P
、および%t
を使用すると、-printf
でファイルへのパスと変更時刻を指定できます。
次のスクリプトのように、bash
オプションを有効にしてglobstar
を使用できます。
#!/bin/bash
shopt -s globstar
for i
do for k in **/"$i"*/
do stat -c "the folder %n was modified on %y" "$k"
done
done
script
として保存し、chmod +x script
で実行可能にし、必要に応じて呼び出します。
bash /path/to/script testRegex Pub
これにより、たとえばPub*
、実際に*Pub*
と一致させたい場合は、**/"$i"*/
を**/*"$i"*/
に変更します。タイムスタンプを短くしたい場合は、| sed 's/:[^:]*$//'
行の最後にdo stat
を追加してみてください。また、%N
の代わりに%n
を試してください。特にスペースを含むディレクトリ名に関しては、この形式が望ましいです。
date
を使用して日付形式をより詳細に制御したい場合は、do stat
行を次のように置き換えます。
do date -d@$(stat -c%Y "$k") +"the folder $k was modified on %b %d %R"
その後、man date
で説明されている通常のdate
フォーマットシーケンスを使用できます。 May 15 01:19
リクエストどおり。
最後になりましたが、上記の出力をきれいに印刷するには、ディレクトリ名の後にタブを挿入し、次のようにcolumn
を使用します。
#!/bin/bash
shopt -s globstar
for i
do for k in **/"$i"*/
do date -d@$(stat -c%Y "$k") +"the folder $k%twas modified on %b %d %R"
done
done | column -ts$'\t'
$ tree
.
├── 1
│ └── 1
│ └── 1
├── 1something
└── 2
└── 1
$ bash -O globstar -c 'for i; do for k in **/"$i"*/; do stat -c "the folder %n was modified on %y" "$k"; done; done' _ 1
the folder 1/ was modified on 2018-06-07 09:45:28.098693507 +0200
the folder 1/1/ was modified on 2018-06-07 09:45:28.098693507 +0200
the folder 1/1/1/ was modified on 2018-06-07 09:45:28.098693507 +0200
the folder 1something/ was modified on 2018-06-07 09:55:36.066531665 +0200
the folder 2/1/ was modified on 2018-06-07 09:45:28.098693507 +0200
$ bash -O globstar -c 'for i; do for k in **/"$i"*/; do stat -c "the folder %n was modified on %y" "$k" | sed 's/:[^:]*$//'; done; done' _ 1
the folder 1/ was modified on 2018-06-07 09:45
the folder 1/1/ was modified on 2018-06-07 09:45
the folder 1/1/1/ was modified on 2018-06-07 09:45
the folder 1something/ was modified on 2018-06-07 09:55
the folder 2/1/ was modified on 2018-06-07 09:45
$ bash -O globstar -c 'for i; do for k in **/"$i"*/; do date -d@$(stat -c%Y "$k") +"the folder $k was modified on %b %d %R"; done; done' _ 1
the folder 1/ was modified on Jun 07 09:45
the folder 1/1/ was modified on Jun 07 09:45
the folder 1/1/1/ was modified on Jun 07 09:45
the folder 1something/ was modified on Jun 07 09:55
the folder 2/1/ was modified on Jun 07 09:45
$ bash -O globstar -c 'for i; do for k in **/"$i"*/; do date -d@$(stat -c%Y "$k") +"the folder $k%twas modified on %b %d %R"; done; done | column -ts'"$'\t'" _ 1
the folder 1/ was modified on Jun 07 09:45
the folder 1/1/ was modified on Jun 07 09:45
the folder 1/1/1/ was modified on Jun 07 09:45
the folder 1something/ was modified on Jun 07 09:55
the folder 2/1/ was modified on Jun 07 09:45
find
コマンドは、必要なことを1行で実行できます。printf
のfind
アクションをご覧ください。
seeman find
printfのパラメーターの詳細
例
find /PATH/TO/SCAN -type d -iname '*pub*' -printf "%p %TY-%Tm-%Td %TH:%TM\n"
-type d : search for folders
-iname '*pub*' : find the pattern case insensitive
%p : display path of found folder
%TY : time Year
%Tm : time month
%Td : time day
%TH : time hour
%TM : time minutes
%TS : time seconds
-regex
の代わりに-names
を使用するわずかなバリエーションがあります。
find . -type d -regex ".*\($1\).*$" -printf 'The folder %P was modified on %Tb %Td %TH:%TM\n'
これは、単一行のスクリプトか、さらに優れた機能のいずれかです。次のように呼び出します:
./Finder.sh 'Vid\|Doc'
これにより、より慣用的なgrep
のようなアプローチが可能になります。