2

たくさんのディレクトリがあります。それらのいくつかには「.todo」ファイルが含まれています。

/storage/BCC9F9D00663A8043F8D73369E920632/.todo
/storage/BAE9BBF30CCEF5210534E875FC80D37E/.todo
/storage/CBB46FF977EE166815A042F3DEEFB865/.todo
/storage/8ABCBF3194F5D7E97E83C4FD042AB8E7/.todo
/storage/9DB9411F403BD282B097CBF06A9687F5/.todo
/storage/99A9BA69543CD48BA4BD59594169BBAC/.todo
/storage/0B6FB65D4E46CBD8A9B1E704CFACC42E/.todo

次のように、「find」コマンドでディレクトリのみを出力してほしい

/storage/BCC9F9D00663A8043F8D73369E920632
/storage/BAE9BBF30CCEF5210534E875FC80D37E
/storage/CBB46FF977EE166815A042F3DEEFB865
...

ここに私がこれまでに持っているものがありますが、「.todo」ファイルもリストされています

#!/bin/bash
STORAGEFOLDER='/storage'
find $STORAGEFOLDER -name .todo  -exec ls -l {} \;

ばかばかしいはずですが、私はあきらめています:(

4

2 に答える 2

7

ディレクトリ名のみを印刷するには、 を使用します-printf '%h\n'。変数を二重引用符で囲むこともお勧めします。

find "$STORAGEFOLDER" -name .todo -printf '%h\n'

出力を処理する場合:

find "$STORAGEFOLDER" -name .todo -printf '%h\n' | xargs ls -l

または、プロセス置換を含むループを使用して、変数を利用します。

while read -r DIR; do
    ls -l "$DIR"
done < <(exec find "$STORAGEFOLDER" -name .todo -printf '%h\n')

ループは実際には一度に 1 つのディレクトリを処理しますが、xargs ではディレクトリはls -l一度に渡されます。

一度に 1 つのディレクトリのみを処理するようにするには、uniq を追加します。

find "$STORAGEFOLDER" -name .todo -printf '%h\n' | uniq | xargs ls -l

または

while read -r DIR; do
    ls -l "$DIR"
done < <(exec find "$STORAGEFOLDER" -name .todo -printf '%h\n' | uniq)

bash がなく、ループ外の変数への変更を保持することを気にしない場合は、パイプを使用できます。

find "$STORAGEFOLDER" -name .todo -printf '%h\n' | uniq | while read -r DIR; do
    ls -l "$DIR"
done
于 2013-09-24T18:18:25.430 に答える