【问题标题】:Using LS for a specific path & file type without returing full file path?将 LS 用于特定路径和文件类型而不返回完整文件路径?
【发布时间】:2013-08-11 20:01:56
【问题描述】:

我正在编写一个 bash 脚本,并希望使用 LS 给它一个路径/*.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 管道的解决方案。

有什么想法吗?谢谢大家!

【问题讨论】:

    标签: linux bash ls


    【解决方案1】:

    您可能会为此使用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).
    

    【讨论】:

      【解决方案2】:

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

      ls /home/admin/Backup/*.tar | awk -F/ '{print $NF}'
      

      【讨论】:

        【解决方案3】:

        从目录运行ls 命令:

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

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

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

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

        【讨论】:

          【解决方案4】:

          should not use ls for this。相反,只需使用全名创建一个数组:

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

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

          【讨论】:

          • 我喜欢你的解决方案,但它需要大量代码的返工,但谢谢下次我做类似的事情时,我会记住这一点。谢谢!
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2022-08-18
          • 1970-01-01
          • 2021-07-11
          • 1970-01-01
          • 2022-11-25
          • 2014-12-21
          • 2019-05-27
          相关资源
          最近更新 更多