Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix 按文件名长度对文件名进行排序_Unix_Sorting - Fatal编程技术网

Unix 按文件名长度对文件名进行排序

Unix 按文件名长度对文件名进行排序,unix,sorting,Unix,Sorting,ls显示目录中可用的文件。我希望根据文件名的长度显示文件名 我们将非常感谢您的帮助。 提前谢谢你可以这样做 for i in `ls`; do LEN=`expr length $i`; echo $LEN $i; done | sort -n 生成测试文件: mkdir -p test; cd test touch short-file-name medium-file-name loooong-file-name 剧本: ls |awk '{print length($0)"\t"

ls显示目录中可用的文件。我希望根据文件名的长度显示文件名

我们将非常感谢您的帮助。 提前谢谢

你可以这样做

for i in `ls`; do LEN=`expr length $i`; echo $LEN $i; done | sort -n
生成测试文件:

mkdir -p test; cd test 
touch short-file-name  medium-file-name  loooong-file-name
剧本:

ls |awk '{print length($0)"\t"$0}' |sort -n |cut --complement -f1
输出:

short-file-name
medium-file-name
loooong-file-name

最简单的方法就是:

$ ls | perl -e 'print sort { length($b) <=> length($a) } <>'
$ls | perl-e'打印排序{length($b)length($a)}
TL;博士 命令:

find-maxdepth 1-类型f-print0 | sed's#\./.*/\([^/]\+\)\./$\1#g'|tr'\n'/'| perl-f'/\0/'-ape'$=join(“\n”,排序{length($b)length($a)}@f)}| sed's'/\\n/\\
更易于阅读的命令的替代版本:

find-maxdepth 1-类型f-打印0|\
sed's#\./.*/\([^/]\+\)\./$\1#g'| tr'\n'/''\
perl-F'/\0/'-ape\
“$\=join(“\n”,排序{length($b)length($a)}@F)”|\
sed's#/#/\\n/#g'

产出和基准 这里有很好的答案。然而,如果你想听从建议,这里有一些方法来完成这项工作。这将特别注意文件名中有空格的情况。我将在这里对所有内容以及配对-
ls
示例进行基准测试。(希望我能很快找到答案。)在过去25年左右的时间里,我从不同的地方下载了一些随机的文件名——首先是73个。所有73个文件名都是“普通”文件名,只有字母数字字符、下划线、点和连字符。我现在再添加2个(为了显示某些排序的问题)

bballdave025@MY-机器/主/bballdave025/原始目录73
$mkdir../dir\u w\u fnames\u空间
bballdave025@MY-机器/主/bballdave025/原始目录73
$cp./*../dir\u w\u fnames\u空间/
bballdave025@MY-机器/主/bballdave025/原始目录73
$cd../dir\u w\u fnames\u空间/
bballdave025@MY-MACHINE/home/bballdave025/dir\u w\u fnames\u空间
$touch“只有一个文件名很长,可能会丢失一些计数”
bballdave025@MY-MACHINE/home/bballdave025/dir\u w\u fnames\u空间
$mkdir../dir\u w\u fnames\u空间\u和\u换行符
bballdave025@MY-MACHINE/home/bballdave025/dir\u w\u fnames\u空间
$cp./*../dir\u w\u fnames\u空间和新行/
bballdave025@MY-MACHINE/home/bballdave025/dir\u w\u fnames\u空间
$cd../dir\u w\u fnames\u空格\u和\u换行符/
bballdave025@MY-MACHINE/home/bballdave025/dir_w_fnames_______空间_____新行
$touch$'w\nlf.aa'
这个,即文件名

w
lf.aa
表示withlinefeed-我这样做是为了更容易看到问题。我不知道为什么我选择
.aa
作为文件扩展名,除了它使这个文件名长度在排序中很容易看到之外

现在,我回到
orig\u dir\u 73
目录;请相信我,这个目录只包含文件。我们将使用可靠的方法获取文件的数量

bballdave025@MY-机器/主/bballdave025/原始目录73
$du--inodes
74      .
bballdave025@MY-机器/主/bballdave025/原始目录73
$#第74个inode用于当前目录';我们有73个文件

还有一种更可靠的方法,它不依赖于只有文件的目录,也不要求您记住额外的
inode。我只是浏览了
man
页面,做了一些研究,做了一些实验。此命令是


awk-F“\0”{print NF-1}”<我认为它是根据文件大小排序的,我希望它是根据文件名的长度排序的。前两个解决方案很好。感谢大家的回复。
ls|awk'{print length($0)”\t“$0}”sort-n | cut-f2
适用于BusyBox v1.01Raghuram上面的答案在bash shell中的FreeBSD上对我不起作用,但这一个确实起作用。一定要爱perl。谢谢。
perl-我们说sort{length$a length$b}glob“*”
map
glob
之间插入
grep{-f}
,只包含普通文件。(不是为了和你的学习竞争:)@zdim太棒了。这与我的学习没有竞争,它促进了我的学习。我喜欢这样,因为我总是在学习新东西。使用find、xargs和perl。真是一团糟,太好了!不需要perl。适用于带有空格的文件名。
for i in *; do printf "%d\t%s\n" "${#i}" "$i"; done | sort -n | cut -f2-
********
********
*******
**********       <-- Visual Problem
*****
*****
****
****
********
*******
*                <-- Visual
****             <-- Problems
*****
*****
****
****
w(\n)
lf.aa