如何输出一个 txt 文件,该文件包含文件名的一部分,后跟文件夹中所有文件的文件路径,每个文件一行?

如何输出一个 txt 文件,该文件包含文件名的一部分,后跟文件夹中所有文件的文件路径,每个文件一行?

我有以下文件

/folder/abc1.txt.gz
/folder/abc2.txt.gz
/folder/abc3.txt.gz

我想制作一个txt文件,内容如下

abc1 /folder/abc1.txt.gz
abc2 /folder/abc2.txt.gz
abc3 /folder/abc3.txt.gz

我使用了以下命令

find /folder -name 'abc*.txt.gz' -type f -printf '%f %p\n' > out.txt

这将输出:

abc1.txt.gz /folder/abc1.txt.gz
abc2.txt.gz /folder/abc2.txt.gz
abc3.txt.gz /folder/abc3.txt.gz

我怎样才能只有文件名的第一部分(没有.txt.gz),后面跟着路径?

答案1

如果它始终是相同的扩展名,您可以通过以下方式删除它:

find /folder -name 'abc*.txt.gz' -type f -printf '%f %p\n' |sed 's/\.txt.gz//'

sed命令只会删除第一次出现的.txt.gz.

如果您想删除任何扩展:

find /folder -name 'abc*.txt.gz' -type f -printf '%f %p\n' |sed 's/\.[^[:space:]]* / /'

假设扩展本身没有任何空格,它将删除第一个点之后.直到第一个空格的所有非空格字符。

答案2

由于您正在寻找使用 的解决方案basename,并且如果我们可以假设.txt.gz后缀在您的文件集中是不变的,并且您正在使用bash

declare -a files

readarray -t files < <( find /folder -name '*.txt.gz' -type f )

for f in "${files[@]}"
do
        printf '%s %s\n' "$(basename "$f" '.txt.gz')" "$f"
done

$ test.sh
abc1 /folder/abc1.txt.gz
abc2 /folder/abc2.txt.gz
abc3 /folder/abc3.txt.gz

答案3

对于 shell bash:

find folder/ -name 'abc*.txt.gz' -exec bash -c ': ${0##*/}; echo ${_%%.*} $0' {} \;

:一个空命令,但它的参数${0##*/}被分配给$_内部变量(上一个简单命令的最后一个参数)。

答案4

只需使用basename来删除文件中的目录路径和后缀,然后使用-print打印完整路径名,然后将两者结合起来paste

find /folder -name 'abc*.txt.gz' -type f -exec basename {} .txt.gz \; -print |
paste - -

这将创建具有两个制表符分隔列的输出行,其中第一列是找到的文件的输出basename,第二列是找到的文件的完整路径名。您是否想要一个空格作为分隔符,然后使用paste -d ' ' - -代替paste - -.

这依赖于不包含嵌入换行符的名称,并且包含使用的分隔符的名称paste也可能导致难以解析的列表。

相关内容