我一直看到引用此链接的答案明确指出“不要解析ls!” 这让我感到困扰有几个原因:
似乎该链接中的信息已被批量接受,几乎没有问题,尽管我可以在随意阅读中至少挑出一些错误。
该链接中所述的问题似乎也引发了不想找到解决方案的愿望。
从第一段:
...当你要求
[ls]一个文件列表时,有一个大问题:Unix 允许文件名中的几乎任何字符,包括空格、换行符、逗号、管道符号,以及几乎任何你曾经尝试用作除 NUL 外的分隔符。...ls用换行符分隔文件名。这很好,直到您的文件名称中包含换行符。并且由于我不知道任何ls允许您使用 NUL 字符而不是换行符终止文件名的实现,这使我们无法使用ls.
无赖,对吧?如何以往我们可以处理一个换行符终止的上市数据集可能包含换行符的数据?好吧,如果这个网站上回答问题的人不是每天都做这种事情,我可能会认为我们遇到了麻烦。
事实是,大多数ls实现实际上提供了一个非常简单的 api 来解析它们的输出,我们一直在做,甚至没有意识到。您不仅可以以 null 结束文件名,还可以以 null 或您可能需要的任何其他任意字符串开头。更重要的是,您可以为每个文件类型分配这些任意字符串。请考虑:
LS_COLORS='lc=\0:rc=:ec=\0\0\0:fi=:di=:' ls -l --color=always | cat -A
total 4$
drwxr-xr-x 1 mikeserv mikeserv 0 Jul 10 01:05 ^@^@^@^@dir^@^@^@/$
-rw-r--r-- 1 mikeserv mikeserv 4 Jul 10 02:18 ^@file1^@^@^@$
-rw-r--r-- 1 mikeserv mikeserv 0 Jul 10 01:08 ^@file2^@^@^@$
-rw-r--r-- 1 mikeserv mikeserv 0 Jul …Run Code Online (Sandbox Code Playgroud) 我可以ls -ld */用来列出当前目录中的所有目录条目。有没有类似的简单方法来列出当前目录中的所有常规文件?我知道我可以使用 find
find . -maxdepth 1 -type f
Run Code Online (Sandbox Code Playgroud)
或统计
stat -c "%F %n" * | grep "regular file" | cut -d' ' -f 3-
Run Code Online (Sandbox Code Playgroud)
但这些并没有让我觉得过于优雅。有没有一个很好的简短方法来只列出常规文件(我不关心设备、管道等)而不是当前目录的子目录?列出符号链接也是一个加分项,但不是必需的。
我希望列出当前目录中的所有i节点的常规文件(即不是目录,链接或特殊文件),有ls -la(ll)。
我去man ls寻找,type只找到了这个,我在这方面不太明白:
--indicator-style=WORD
将带有 WORD 样式的指示符附加到条目名称:无(默认)、斜线 (-p)、文件类型 (--file-type)、分类 (-F)
我怎么能只列出带有ls -la(ll作为我在 Ubuntu 18.04 中的快捷方式) 的常规文件?
我已经在线检查了一些答案,但是当命令中有参数时它们不起作用-name(也许我做错了什么,不确定)。我想做的是仅列出文件名(而不是目录/路径),更复杂的是,我有相同的文件名但具有不同的扩展名,所以我需要使用-name和 来过滤结果-o,问题是我的建议看到使用 或-printf,basename并且当存在时这些效果不佳-name *.txt -o name *.pdf。还有其他方法可以解决这个问题吗?
我的文件示例:
\n/dir1/dir2/dir3/dir4/\n /file1.txt\n /file1.pdf\n /file1.ods ...etc.\nRun Code Online (Sandbox Code Playgroud)\n我只对每个列表列出一种或多种类型的文件感兴趣(通过使用-name来过滤我的结果。
是否可以仅使用 1 个find命令来完成它,或者我必须分两步完成(将结果保存在临时文件中,然后从临时文件中过滤/删除目录)?我试图完成的结果是一个文本文件,每行都有文件名:
file1.txt\nfile1.pdf\nfile1.ods\nfile2.txt\nfile2.pdf\netc.\nRun Code Online (Sandbox Code Playgroud)\n我使用的命令是
\nfind /dir1/dir2/dir3/dir4/ -type f -name '*.txt' -o -name '*.pdf' -o -name '*.ods' -printf "%f\\n"\nRun Code Online (Sandbox Code Playgroud)\n我正在使用 GNU 查找。
\n更新
\n事实证明我必须把\\(...\\),正如 \xce\xb1\xd2\x93s\xd0\xbd\xce\xb9\xce\xb7 提醒的那样
我必须解析ls -Al输出并获取文件或目录名称
ls -Al 输出 :
drwxr-xr-x 12 s162103 studs 12 march 28 2012 personal domain
drwxr-xr-x 2 s162103 studs 3 march 28 22:32 public_html
drwxr-xr-x 7 s162103 studs 8 march 28 13:59 WebApplication1
Run Code Online (Sandbox Code Playgroud)
我应该只使用 ls -Al | <something>
例如:
ls -Al | awk '{print $8}'
Run Code Online (Sandbox Code Playgroud)
但这不起作用,因为$8如果目录名称中有空格,则不是名称,它是名称的一部分。也许有一些实用程序可以删除姓氏或删除以前的任何内容?
我正在尝试获取另一个文件夹中文件夹的名称。我试图使用波纹管代码,但问题是它返回文件夹的完整地址,而不仅仅是文件夹名称
for folder in /[my folder]/*; do cat $folder; done
Run Code Online (Sandbox Code Playgroud)
有了这个,我得到了/[my folder]/subfolder1,我所期望的只是subfolder1.
谢谢