1

ファイルを含む「リーフ」ディレクトリのリストを取得したかったのですが、それらのディレクトリのいずれにも2つの時間範囲内に変更されたファイルが含まれていない場合に限りました。私はbashスクリプトが速いと思った..これを見つけた:https://superuser.com/questions/195879/using-find-to-list-only-directories-with-no-more-childs 今、私はこれを持っています:

#!/bin/bash
#get list of deepest directory's with files
#format output so directory's can contain spaces
check_dirs=$( { find . -type d ! -empty ; echo; } |
    awk 'index($0,prev"/")!=1 && NR!=1 {printf("\"%s\" ",prev);}
    {sub(/\/$/,""); prev=$0}' )
#run find once but get two lists of files to bash arrays --todo  
find ${check_dirs} \( -ctime 3 -print \), \( -ctime 8 -print \)

find は、手動で実行するとスペースで区切られた引用符で囲まれたパスのリストを処理しますが、スクリプトで実行すると、スペースで区切り、単一引用符を追加しますか? この種の出力が得られます。

find: `"/path/to/suff"': そのようなファイルやディレクトリはありません

find: `"/path/to/suff1"': そのようなファイルやディレクトリはありません

find: `"/path/to/suffwith"': そのようなファイルやディレクトリはありません

find: `"space"': そのようなファイルやディレクトリはありません

find: `"in"': そのようなファイルやディレクトリはありません

find: `"name"': そのようなファイルまたはディレクトリはありません

find: `"/path/to/suff2"': そのようなファイルやディレクトリはありません

ここで何が起こっているのですか?

4

2 に答える 2

0

ご存じのように、見つかったパスの一部にはスペースが含まれています。問題は次の行です。

find ${check_dirs} \( -ctime 3 -print \), \( -ctime 8 -print \)

ここでは、 で単語分割を許可して$check_dirsいますが、find はそれから有効な引数を取得していないため、続行する方法がわかりません。

対話型シェルで引用符を使用すると、bash は引用符を使用して単語分割を防ぎますが、引用符がパラメーター内にある場合、bash はパラメーターを展開した後に単語分割を実行するため、引用符は単語の一部にすぎません。

最初のステップは、大騒ぎせずにリーフ ディレクトリを「ただ」出力する find コマンドを作成することです。これが1つです

find . -depth -type d -execdir bash -O dotglob -c 'set -- "$1"/*/; ! test -d "$1"' _ {} \; -print

もちろん、代わりに-print\; の直後に ctime 述語を組み合わせることができます。

于 2013-10-04T02:54:55.117 に答える
0

最初にファイルを探し、ディレクトリ名を取得し、リストをソートし、一意の値を取得して、最終的なリストで何かを行うことができます。

find . -newermt '2013-10-04 10:00:01' -not -newermt '2013-10-04 10:04:01' -print0 | \
xargs -r0 dirname | sort | uniq # <do something with your list>
于 2013-10-04T13:11:21.073 に答える