web-dev-qa-db-ja.com

すべてのディレクトリ名の変更パターンの変更日を出力するシェル

次のようなパターンに名前が一致するすべてのフォルダーを通過するシェルプログラムを作成します。

Sudo sh  Shell.sh   pub 

スクリプトを実行すると、名前にpubが含まれるすべてのフォルダーが検索され、変更日が出力されます。この画像のような結果を出力するコードが欲しい: enter image description here このコードはありますが、期待した結果が得られません。

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 
4
Muh

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でファイルへのパスと変更時刻を指定できます。

6
muru

次のスクリプトのように、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
5
dessert

findコマンドは、必要なことを1行で実行できます。

printffindアクションをご覧ください。
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


詳細情報
GNU findの公式Webページ
25個のfindコマンドの実用例

4
cmak.fr

-regexの代わりに-namesを使用するわずかなバリエーションがあります。

find . -type d -regex ".*\($1\).*$" -printf 'The folder %P was modified on %Tb %Td %TH:%TM\n'

これは、単一行のスクリプトか、さらに優れた機能のいずれかです。次のように呼び出します:

./Finder.sh 'Vid\|Doc'

これにより、より慣用的なgrepのようなアプローチが可能になります。

2