我有以下文件
/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
也可能导致难以解析的列表。