1

我正在编写一个 bash 脚本,并想使用 LS 给它一个 path/*.tar 并让它只返回文件名而不是完整路径和文件名,以通过读取将文件名传递到数组中,下面是发生的事情终端:

如果我只是将 LS 与一个目录一起使用,它会返回:

admin@linuxbox:~$ ls  /home/admin/Backup/
0_BuIndex.txt.backup  Backup1376238064.tar  Backup1376239611.tar  Backup1376241919.tar
Backup1376167035.tar  Backup1376238960.tar  Backup1376240158.tar  Backup1376243097.tar
Backup1376168581.tar  Backup1376239110.tar  Backup1376241421.tar
Backup1376237070.tar  Backup1376239350.tar  Backup1376241489.tar
Backup1376237928.tar  Backup1376239479.tar  Backup1376241608.tar

给出它返回的路径和文件类型:

admin@linuxbox:~$ ls  /home/admin/Backup/*.tar
/home/admin/Backup/Backup1376167035.tar  /home/admin/Backup/Backup1376239479.tar
/home/admin/Backup/Backup1376168581.tar  /home/admin/Backup/Backup1376239611.tar
/home/admin/Backup/Backup1376237070.tar  /home/admin/Backup/Backup1376240158.tar
/home/admin/Backup/Backup1376237928.tar  /home/admin/Backup/Backup1376241421.tar
/home/admin/Backup/Backup1376238064.tar  /home/admin/Backup/Backup1376241489.tar
/home/admin/Backup/Backup1376238960.tar  /home/admin/Backup/Backup1376241608.tar
/home/admin/Backup/Backup1376239110.tar  /home/admin/Backup/Backup1376241919.tar
/home/admin/Backup/Backup1376239350.tar  /home/admin/Backup/Backup1376243097.tar

我想使用像第二个这样的命令,但它只返回没有路径的文件名,我现在的工作是使用

read -r -a TarArray <<< `ls -1 /home/admin/Backup | grep "tar"`

但我希望找到一个不需要我通过 grep 管道的解决方案。

有任何想法吗?谢谢大家!

4

4 回答 4

3

您可能会find为此使用:

find /home/admin/Backup -name \*.tar -printf '%f\n'

从手册页:

-printf format
    True;  print  format  on  the standard output,
    interpreting `\' escapes and `%' directives.
    ...
    %f     File's name with any leading directories
           removed (only the last element).
于 2013-08-11T20:09:06.047 回答
2

所以我知道已经选择了答案,但这里有一个选项供您使用ls,以防您好奇:

ls /home/admin/Backup/*.tar | awk -F/ '{print $NF}'
于 2013-08-11T22:12:56.727 回答
1

从目录运行ls命令:

( cd /home/admin/Backup ; ls *.tar )

但是你真的不需要为此使用ls命令。shell 已经为你扩展了*tar通配符;在这种情况下所做ls的就是打印参数。所以:

( cd /home/admin/Backup ; echo *.tar )

(顺便说一句,您的命令 withgrep "tar"将列出"tar"名称中包含任何位置的所有文件,而不仅仅是名称以 . 结尾的文件.tar。如果您想使用grep,您会想要grep '\.tar$'。)

于 2013-08-11T20:30:11.880 回答
0

不应该使用ls这个。相反,只需使用全名创建一个数组:

files=(/path/to/dir/*.tar)

...并basename在处理数组时在每个元素上运行。

于 2013-08-11T20:21:46.117 回答