我用来find
获取文件列表,然后用 grep 进行路径匹配:
$ find pc* | grep -i arthur
pc6/arthurv/untitled-2.py
pc6/arthurv/untitled-3.py
pc6/arthur.py
pc9/Arthur 4C
pc9/Arthur 4C/untitled-1.py
pc9/Arthur 4C/untitled-2.py
我想这样做并为每个目录ls -F
附加一个。/
或者,如何 find 显示所有匹配不区分大小写的目录arthur
?
答案1
可以在find
表达式中使用析取来实现条件处理;与 GNU find
:
find pc* -type d -printf "%p/\n" -o -print
将找到以匹配“pc*”的文件和目录开头的路径中的所有内容,并打印它们的名称,如果它们是目录,则后跟“/”。
其工作方式如下:
pc*
指定起始路径;-type d
匹配目录;-printf "%p/\n"
打印当前处理文件的路径,后跟“/”和换行符;因为它遵循-type d
,所以只有在匹配时才会执行-type d
(有一个隐式连词);-o
引入析取:如果前面的表达式不匹配,则将计算其后面的表达式(并且它前面的表达式在-type d -printf "%p/\n"
这里,因为连词的优先级高于析取);-print
打印当前处理的文件的路径。
可以使用其他find
表达式来显示与不区分大小写的“arthur”匹配的所有目录:
find . -type d -iname "*arthur*"
答案2
find
有大量的选项和细节。另一种变体是-printf
与使用%y
$ find . -printf "%p:%y\n"
./dir:d
./file:f
其中%y
添加“d”或“f”就像ls -l
$ find . -printf "%p%y\n" | sed 's!d$!/! ; s!f$!!'
答案3
只需添加到此处的答案即可列出所有文件和目录:
cat <(find old.files -type d -printf "%p/\n") <(find old.files -type f)
输出:
dir1/dir2/
dir1/test.txt
dir1/dir2/test2.txt
以前的问题dir1/dir2
没有尾部斜杠:
dir1/dir2
dir1/test.txt
dir1/dir2/test2.txt
最终是为了能够比较 tar 文件和目录。
diff <(tar tf old.files.tar | sort -u) <(cat <(find old.files -type d -printf "%p/\n") <(find old.files -type f) | sort -u)