【问题标题】:To show only file name without the entire directory path仅显示文件名而不显示整个目录路径
【发布时间】:2012-01-21 01:40:33
【问题描述】:

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 命令来解决,因为它的输出是为了另一个程序。

【问题讨论】:

  • 什么操作系统?例如 OS X 已经做了你想要的。你确定 ls 没有别名吗?

标签: shell unix directory ls


【解决方案1】:

ls whateveryouwant | xargs -n 1 basename

这对你有用吗?

否则你可以(cd /the/directory && ls)(是的,有意使用括号)

【讨论】:

  • 你应该使用ls -d,以防whateveryouwant引用多个目录。
  • 请注意,如果路径包含空格,xargs 将在它们上中断。您需要改用xargs -d '\n' -n 1
  • 这在 Cygwin 上太慢了。
  • xargs 解决方案看起来更整洁,但我发现它很慢。我选择了cd 解决方案,它运行顺利。
  • 在我的情况下使用xargs 是一个更好的解决方案,因为我在执行ls 时给出了整个路径,所以ls -1 在我的情况下不起作用
【解决方案2】:

不需要 Xargs 和所有, ls 绰绰有余。

ls -1 *.txt

逐行显示

【讨论】:

  • 如果您仔细阅读 OP,这是不正确的。这仅适用于您在该目录中。
  • 完美运行!谢谢@VRVigneshwara! ls -1 bin/ 在 Linux Debian 上列出 bin/ 目录中没有路径的条目。
  • 这会导致大量(和很多)文件以及以.txt 结尾的目录出现问题,并且需要globbing 在您的shell 中处于活动状态。
【解决方案3】:

有几种方法可以实现这一目标。一个是这样的:

for filepath in /path/to/dir/*
do
    filename=$(basename $filepath)

    ... whatever you want to do with the file here
done

【讨论】:

    【解决方案4】:

    使用basename 命令:

    basename /home/user/new/*.txt
    

    【讨论】:

      【解决方案5】:

      (cd dir && ls)

      将只输出 dir 中的文件名。如果您希望每行一个,请使用 ls -1

      (根据 Sactiw 的评论将 ; 更改为 &&)。

      【讨论】:

      • 使用';'在这种情况下,代替 '&&' 用于链接命令将是错误的,因为它会在不存在的 'dir' 的情况下返回一些输出,即从执行此命令的当前工作目录中列出文件。例如。 (cd fake_dir ; ls) 即使不存在这样的 fake_dir 也会列出当前目录中的文件,这是不正确的。
      【解决方案6】:

      一个奇特的解决方法是使用两次“rev”和“cut”:

      find ./ -name "*.txt" | rev | cut -d '/' -f1 | rev
      

      【讨论】:

        【解决方案7】:

        您可以在命令行中添加一个 sed 脚本:

        ls /home/user/new/*.txt | sed -r 's/^.+\///'
        

        【讨论】:

          【解决方案8】:

          选择的答案对我不起作用,因为我的文件名中有空格、引号和其他奇怪的字符。要引用basename 的输入,您应该使用:

          ls /path/to/my/directory | xargs -n1 -I{} basename "{}"
          

          无论文件被调用什么,这都可以保证工作。

          【讨论】:

            【解决方案9】:

            我更喜欢 fge 已经回答的基本名称。 另一种方法是:

            ls /home/user/new/*.txt|awk -F"/" '{print $NF}'
            

            另一种丑陋的方式是:

            ls /home/user/new/*.txt| perl -pe 's/\//\n/g'|tail -1
            

            【讨论】:

              【解决方案10】:

              只是希望对某人有所帮助,因为老问题似乎不时出现,我总是在这里找到好的提示。

              我的问题是在一个文本文件中列出某个目录中“*.txt”文件的所有名称,没有路径,也没有来自 Datastage 7.5 序列的扩展名。

              我们使用的解决方案是:

              ls /home/user/new/*.txt | xargs -n 1 basename | cut -d '.' -f1 > name_list.txt
              

              【讨论】:

              • basename 也可以为您删除后缀(您指定要删除的后缀作为第二个参数)。您的命令将变为:ls /home/user/new/*.txt | xargs -n 1 -J % basename % .txt
              【解决方案11】:

              我们有很多方法可以做到这一点,您可以尝试跟随。

              ls /home/user/new | tr '\n' '\n' | grep .txt
              

              另一种方法:

              cd /home/user/new && ls *.txt
              

              【讨论】:

                【解决方案12】:

                当您想在路径中列出名称但它们具有不同的文件扩展名时。

                me@server:/var/backups$ ls -1 *.zip && ls -1 *.gz

                【讨论】:

                  【解决方案13】:

                  这是另一种方式:

                  ls -1 /home/user/new/*.txt|rev|cut -d'/' -f1|rev
                  

                  【讨论】:

                    猜你喜欢
                    • 2016-08-16
                    • 1970-01-01
                    • 1970-01-01
                    • 2022-07-15
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多