ls /home/user/new/*.txt
打印该目录中的所有txt 文件。但是它打印输出如下:
[me@comp]$ ls /home/user/new/*.txt
/home/user/new/file1.txt /home/user/new/file2.txt /home/user/new/file3.txt
等等。
我想运行
ls
命令而不是从 /home/user/new/
目录,因此我必须提供完整的目录名称,但我希望输出仅作为
[me@comp]$ ls /home/user/new/*.txt
file1.txt file2.txt file3.txt
我不想要整个路径。只需要文件名。这个问题必须使用 ls 命令来解决,因为它的输出是针对另一个程序的。
ls whateveryouwant | xargs -n 1 basename
这对你有用吗?
否则你可以
(cd /the/directory && ls)
(是的,括号是有意的)
不需要 Xargs 和 all , ls 就足够了。
ls -1 *.txt
按行显示
有多种方法可以实现这一目标。其中之一是这样的:
for filepath in /path/to/dir/*
do
filename=$(basename $filepath)
... whatever you want to do with the file here
done
使用
basename
命令:
basename /home/user/new/*.txt
(cd dir && ls)
只会输出dir中的文件名。如果您想要每行一个,请使用
ls -1
。
(根据 Saactiw 的评论将 ; 更改为 &&)。
您可以将 sed 脚本添加到命令行中:
ls /home/user/new/*.txt | sed -r 's/^.+\///'
解决这个问题的一个奇特方法是使用两次“rev”和“cut”:
find ./ -name "*.txt" | rev | cut -d '/' -f1 | rev
所选的答案对我不起作用,因为我的文件名中有空格、引号和其他奇怪的字符。要引用
basename
的输入,您应该使用:
ls /path/to/my/directory | xargs -n1 -I{} basename "{}"
无论文件叫什么,这都保证可以工作。
我更喜欢 fge 已经回答的基本名称。 另一种方法是:
ls /home/user/new/*.txt|awk -F"/" '{print $NF}'
另一种丑陋的方式是:
ls /home/user/new/*.txt| perl -pe 's/\//\n/g'|tail -1
只是希望对某人有所帮助,因为老问题似乎时不时地回来,我总是在这里找到好的建议。
我的问题是在文本文件中列出某个目录中“*.txt”文件的所有名称,不带路径且不带来自 Datastage 7.5 序列的扩展名。
我们使用的解决方案是:
ls /home/user/new/*.txt | xargs -n 1 basename | cut -d '.' -f1 > name_list.txt
我们有很多方法可以做到这一点,您可以尝试以下方法。
ls /home/user/new | tr '\n' '\n' | grep .txt
另一种方法:
cd /home/user/new && ls *.txt
还有另一种方法:
ls -1 /home/user/new/*.txt|rev|cut -d'/' -f1|rev
您还可以通过管道连接到 grep 并提取最后一个正斜杠之后的所有内容。它看起来很愚蠢,但我认为防御性 grep 应该没问题,除非(像某种疯子)你的文件名中有正斜杠。
ls folderpathwithcriteria | grep -P -o -e "[^/]*$"
find
s -exec
参数与 basename
非常适合此任务,不需要 xargs
或子 shell:
find "$path" -maxdepth 1 -mindepth 1 -exec basename {} \;
您可以使用
-type d
或 -type f
仅过滤文件或文件夹。
当您想要列出路径中的名称但它们具有不同的文件扩展名时。
me@server:/var/backups$ ls -1 *.zip && ls -1 *.gz