是否可以find … -exec ls -ls ;
按文件名按字母顺序对输出进行排序?
这是我的cron命令:
find /home/setefgge/public_html -type f -ctime -1 -exec ls -ls {} \;
这个命令在大多数情况下都可以。但是结果没有按照任何有意义的顺序排序。如果将它们按文件名字段进行排序将非常有帮助。
ls
会排序。
是否可以find … -exec ls -ls ;
按文件名按字母顺序对输出进行排序?
这是我的cron命令:
find /home/setefgge/public_html -type f -ctime -1 -exec ls -ls {} \;
这个命令在大多数情况下都可以。但是结果没有按照任何有意义的顺序排序。如果将它们按文件名字段进行排序将非常有帮助。
ls
会排序。
Answers:
我假设您的文件名不包含换行符。
find /home/setefgge/public_html -type f -ctime -1 -exec ls -nls {} + | sort -k 10
使用+
而不是;
终止-exec
操作,可以通过批量调用来加快操作速度ls
。您可以通过sort
命令对管道进行排序。告诉它从第10个字段开始排序(前9个是元数据:阻止,权限,链接计数,用户,组,大小和3个日期/时间字段)。该选项-n
告知ls
用户和组使用数字值,从而避免了用户名或组名包含空格的风险。
另外,使用zsh,您可以通过使用glob限定符收集和排序文件并在命令行太长的情况下zargs
运行ls
多次来不假思索地使用任何名称。您确实需要GNU ls
(特别是它的-f
选项)来避免进行重新排序ls
(另一种方法是ls
使用zsh 进行仿真zstat
)。
autoload -U zargs
zargs -- /home/setefgge/public_html/**/*(.c-2) -- ls -lnsf
POSIX关于ls
-l
ong清单中的日期有这样的说法:
该
<date and time>
字段应包含文件上次修改的适当日期和时间戳。在POSIX语言环境中,该字段应等于以下日期命令的输出:
date "+%b %e %H:%M"
...如果文件在最近六个月内已被修改,或者:
date "+%b %e %Y"
考虑到这一点,并确保如果文件名中包含任何换行符,也可以使用POSIX指定的ls -q
选项正确地换行,则为ls
结果准备一个正则表达式相对简单,而一点也不find
做:
d=$(date "+%b %e") y=$(date --date=yesterday "+%b %e")
echo "$d" "$y"
###OUTPUT###
Jul 5 Jul 4
grep
为此,您将仅返回包含表示今天或昨天日期的字符串的行。以下命令对此有所补充:
ls -alRcq | sed "1H;/^-/!{/./d;N;h};/$d\|$y/!d;x;/\n/p;g"
ls
选项包括:
-a
返回目录中的所有文件-包括以。开头的文件 .dot
-l
长时间列出-R
递归列出所有子目录-c
显示修改时间而不是访问时间-q
返回Shell Glob,?
而不是\t
文件名中的不可打印或Ab字符这些结果将通过仅匹配的|pipe
文件传递sed
:
-
(也就是-不d
用于目录)开头的行也包含您的date
。输出看起来像这样:
ls -alRcq --color=always |
sed "1H;/^-/!{/./d;N;h};/$d\|$y/!d;x;/\n/p;g"
###OUTPUT###
.:
-rw------- 1 mikeserv mikeserv 2086 Jul 4 10:52 .bash_history
-rw------- 1 mikeserv mikeserv 2657 Jul 4 15:20 .lesshst
-rw-r--r-- 1 mikeserv mikeserv 681 Jul 5 05:18 .zdirs
-rw------- 1 mikeserv mikeserv 750583 Jul 5 08:28 .zsh_history
-rw-r--r-- 1 mikeserv mikeserv 166 Jul 4 23:02 Terminology.log
-rw-r--r-- 1 mikeserv mikeserv 433568 Jul 4 13:34 shot-2014-06-22_17-10-16.jpg
-rw-r--r-- 1 mikeserv mikeserv 445192 Jul 4 13:34 shot-2014-06-22_17-11-06.jpg
./.cache/efreet:
-rw------- 1 mikeserv mikeserv 37325 Jul 4 22:51 desktop_localhost_C.eet
-rw------- 1 mikeserv mikeserv 37325 Jul 4 23:30 desktop_localhost_en_US.eet
-rw------- 1 mikeserv mikeserv 24090 Jul 4 22:51 desktop_util_localhost_C.eet
-rw------- 1 mikeserv mikeserv 24090 Jul 4 23:30 desktop_util_localhost_en_US.eet
-rw------- 1 mikeserv mikeserv 16037 Jul 4 23:30 icon_themes_localhost.eet
-rw------- 1 mikeserv mikeserv 3117 Jul 4 23:30 icons___efreet_fallback_localhost.eet
-rw------- 1 mikeserv mikeserv 768039 Jul 4 23:30 icons_gnome_localhost.eet
-rw------- 1 mikeserv mikeserv 18589 Jul 4 23:30 icons_hicolor_localhost.eet
./.config:
-rw-r--r-- 1 mikeserv mikeserv 30 Jul 4 19:10 pavucontrol.ini
./.config/chrome:
-rw-r--r-- 1 mikeserv mikeserv 94332179 Jul 4 13:36 conf.tar.lz4.bak
是的,它甚至可以与LS_COLORS
- 一起使用,这cron
当然不是您的优先事项,但是,嘿,您的选择是开放的。
无论如何,与其他可能的解决方案相比,这提供了一些明显的优势。
首先,find
+ ls
涉及多个调用-这仅涉及单个ls
进程,这就是为什么它能够可靠地对所有内容进行排序的原因-默认情况下会这样做-因此sort
也被辅助。
任何解决方案,涉及find
与sort
和ls
被几乎做所有的工作两次。ls
并find
会解析每个路径名和stat
每个文件。ls
并sort
会将所有结果排序。最好只使用single ls
。
然后当然有这个答案的date
和sed
部分。需要注意的重要一点是,您要做的很辛苦,首先要获取正则表达式-只能获取一次-然后再修剪一个结果列表,而不是说获取结果,获取结果,对结果进行排序和对结果进行排序。
这不会破坏包含换行符的文件名,就像其他解决方案一样。该解决方案确实有其自身的警告-我将在下面进行解释-但它们是微小且易于处理的。我认为,这是这里最可靠的解决方案。
在两种情况下,上述命令可能会导致您遇到问题。第一个涉及?
文件名中的glob-尽管它已经比这里提供的任何其他解决方案都更可靠,并且您单独遇到a的可能性?
很小,但有可能解决这些glob可以匹配多个文件名。请参阅此以获取有关此主题的更多信息。
另一种可能性是误报-例如,如果您的文件名实际上与date
我们要搜索的字符串匹配,grep
但实际上在那一天的任何时候都没有修改。我没有指望这是一个问题,但是,如果有的话,请问一下,我也许可以帮助您使正则表达式更加具体,以解决此问题。
ls -l $(find /home/setefgge/public_html -type f -ctime -1 | sort)
ls
自己进行排序,因此find
通过管道传递通过的输出sort
是无用的。此外,您的命令会破坏包含空格的文件名(其中包括空格),并且如果文件名过多,则该命令将失败。
ls -ls **/*(.)