【问题标题】:Force sort command to ignore folder names强制排序命令忽略文件夹名称
【发布时间】:2012-07-10 22:32:12
【问题描述】:

我从基本文件夹中运行了以下内容。/

find . -name *.xvi.txt | sort

返回以下排序顺序:

./LT/filename.2004167.xvi.txt
./LT/filename.2004247.xvi.txt
./pred/2004186/filename.2004186.xvi.txt
./pred/2004202/filename.2004202.xvi.txt
./pred/2004222/filename.2004222.xvi.txt

如您所见,文件名遵循常规结构,但文件本身可能位于目录结构的不同部分。有没有办法忽略文件​​夹名称和/或目录结构,以便排序仅根据文件名本身返回文件夹/文件名列表?像这样:

./LT/filename.2004167.xvi.txt
./pred/2004186/filename.2004186.xvi.txt
./pred/2004202/filename.2004202.xvi.txt
./pred/2004222/filename.2004222.xvi.txt
./LT/filename.2004247.xvi.txt

我在 find 和 sort 命令下尝试了几个不同的开关,但没有成功。我总是可以将所有内容复制到一个文件夹并从那里进行排序,但是有数百个文件,我希望存在更优雅的选项。

谢谢!感谢您的帮助。

【问题讨论】:

  • 确保在-name 的参数周围加上引号。否则,如果您在基本目录中有任何扩展名为 xvi.txt 的文件,这将停止工作。
  • 我没有意识到我养成了一个坏习惯。干杯!

标签: bash sorting find


【解决方案1】:

如果您的find-printf,您可以打印基本文件名和完整文件名。按第一个字段排序,然后将其删除。

find . -name '*.xvi.txt' -printf '%f %p\n' | sort -k1,1 | cut -f 2- -d ' '

我选择了一个空格作为分隔符。如果您的文件名包含空格,您应该选择另一个分隔符,它是一个不在您的文件名中的字符。如果任何文件名包含换行符,则必须修改它,因为它不起作用。

请注意,find 命令中的 glob 应被引用。

【讨论】:

    【解决方案2】:

    如果你的find 没有printf,你可以使用awk 来完成同样的事情:

    find . -name *.xvi.txt | awk -F / '{ print $NF, $0 }' | sort | sed 's/.* //'
    

    Dennis Williamson 提到的有关空间的相同警告也适用于此处。为了多样化,我使用sed 去除排序字段,而不是cut

    【讨论】:

      【解决方案3】:
      find . -name *.xvi.txt | sort -t'.' -k3 -n
      

      会根据需要对其进行排序。唯一的问题是文件名或目录名是否包含附加点。

      为了避免它,你可以使用:

      find . -name *.xvi.txt | sed 's/[0-9]\+.xvi.txt$/\\&/' | sort -t'\' -k2 | sed 's/\\//'
      

      【讨论】:

      • 这是唯一对我来说开箱即用的答案。所以,如果我没看错的话,排序命令会根据选定的分隔符 (-t'.') 划分列表。然后它使用第三列(-k3)中的信息,这是剥离出来的数值(例如,2004186),然后按数字排序(-n)?不过,我确实明白您所说的额外时间是什么意思。
      • @Prophet60091 你是对的。 sed的方式应该没有这样的问题。
      猜你喜欢
      • 2010-10-30
      • 2019-01-09
      • 2016-02-13
      • 2018-08-31
      • 2021-11-25
      • 1970-01-01
      • 1970-01-01
      • 2013-05-26
      • 1970-01-01
      相关资源
      最近更新 更多