我正在尝试使用ls -l
命令以find
格式获取当前日期生成的文件列表,如下所示:
find . -type f -name "sample[0-9]*?_bill[0-9]*?.pdf" -mtime 0 -exec ls -l {} \;
以上命令的输出为:
-rw-r--r--. 1 root root 17843 Aug 20 08:02 ./sample32_bill45.pdf
-rw-r--r--. 1 root root 17840 Aug 20 08:02 ./sample80_bill46.pdf
预期输出:
-rw-r--r--. 1 root root 17843 Aug 20 08:02 sample32_bill45.pdf
-rw-r--r--. 1 root root 17840 Aug 20 08:02 sample80_bill46.pdf
我无法弄清楚如何从输出的第9列中删除./
部分,以便获得所需的输出。
任何帮助将不胜感激。
答案 0 :(得分:3)
对于当前目录.
,可以将%P
的{{1}}指令用作解决方法:
-printf
来自find . -type f ... -printf '%P\0' | xargs -0 ls -l
:
man find
(-printf format
)文件名及其起点的名称 被删除。
答案 1 :(得分:2)
仅适用于OSX find
:
使用-execdir
选项代替-exec
:
find . -type f -name "sample[0-9]*?_bill[0-9]*?.pdf" -mtime 0 -execdir ls -l {} +
此外,您可以使用+
代替\;
来提高效率
上述行为发生在OSX find
上。为gnu find
使用以下脚本来摆脱./
:
find . -type f -name "sample[0-9]*?_bill[0-9]*?.pdf" -mtime 0 \
-exec bash -c 'ls -l "${@#./}"' - '{}' +
或者您可以在find
上将此循环与进程替换一起使用:
while IFS= read -d '' -r file; do
ls -l "${file#./}"
done < <(find . -type f -name "sample[0-9]*?_bill[0-9]*?.pdf" -mtime 0 -print0)
答案 2 :(得分:1)
尽管我尝试使用find
命令本身解决此问题,但是它仍然在输出中显示./
,现在用awk
命令添加find
find -type f -name "sample[0-9]*?_bill[0-9]*?.pdf" -mtime 0 -exec ls -l {} \+ | awk '{sub("./","",$NF)} 1'
或(如果文件名中包含空格,则可以使用以下符号)
find -type f -name "sample[0-9]*?_bill[0-9]*?.pdf" -mtime 0 -exec ls -l {} \+ | awk '{sub("./","")} 1'
输出如下(样本/虚拟文件)
-rw-rw-r-- 1 singh singh 0 Aug 20 04:08 sample32_bill4524242424.pdf
-rw-rw-r-- 1 singh singh 0 Aug 20 04:08 sample32_bill452424.pdf
-rw-rw-r-- 1 singh singh 0 Aug 20 04:08 sample32_bill45.pdf
编辑: :由于使用sample[0-9]*?_bill[0-9]*?.pdf
的glob不能用空格捕获文件名(我通过创建名为{{1 }}),如果有人想获取所有仅以字符串sample 32_bill 4524242424.pdf
开头的文件详细信息,并且文件名的名称中可以有空格,则可以在此处提供帮助,以下内容可能会对您有所帮助(感谢三位一体的先生在此答案的评论部分提到)。
sample
输出如下。
find -type f -name "sample*" -mtime 0 -exec ls -l {} \+ | awk 'match($0,/.*\.\//){print substr($0,RSTART,RLENGTH-2) substr($0,RSTART+RLENGTH)}'
OR
find -type f -name "sample*" -mtime 0 -exec ls -l {} \+ | sed 's%\./%%'