Linux中的输出格式

时间:2018-08-20 08:06:57

标签: linux bash find

我正在尝试使用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列中删除./部分,以便获得所需的输出。

任何帮助将不胜感激。

3 个答案:

答案 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%\./%%'