2

我有一堆目录;其中一些包含一个“.todo”文件。

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

我希望“查找”命令只打印目录,就像这样

/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')

该循环实际上一次处理一个目录,而在 xargs 中,目录是ls -l一次性传递的。

要确保一次只处理一个目录,请添加 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 回答
1

剥离文件名并仅显示其所在目录的快速简便的答案是dirname

#!/bin/bash
STORAGEFOLDER='/storage'
find "$STORAGEFOLDER" -name .todo  -exec dirname {} \;
于 2016-06-08T11:53:53.533 回答