![如何输出一个 txt 文件,该文件包含文件名的一部分,后跟文件夹中所有文件的文件路径,每个文件一行?](https://linux22.com/image/199702/%E5%A6%82%E4%BD%95%E8%BE%93%E5%87%BA%E4%B8%80%E4%B8%AA%20txt%20%E6%96%87%E4%BB%B6%EF%BC%8C%E8%AF%A5%E6%96%87%E4%BB%B6%E5%8C%85%E5%90%AB%E6%96%87%E4%BB%B6%E5%90%8D%E7%9A%84%E4%B8%80%E9%83%A8%E5%88%86%EF%BC%8C%E5%90%8E%E8%B7%9F%E6%96%87%E4%BB%B6%E5%A4%B9%E4%B8%AD%E6%89%80%E6%9C%89%E6%96%87%E4%BB%B6%E7%9A%84%E6%96%87%E4%BB%B6%E8%B7%AF%E5%BE%84%EF%BC%8C%E6%AF%8F%E4%B8%AA%E6%96%87%E4%BB%B6%E4%B8%80%E8%A1%8C%EF%BC%9F.png)
我有以下文件
/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
也可能导致难以解析的列表。