如何使用基本 UNIX 工具从路径名中删除扩展名

如何使用基本 UNIX 工具从路径名中删除扩展名

我需要收集文件列表并将其放入文本文件中。但是,文件不应包含其扩展名。

我现在使用的不删除文件扩展名的命令是:

ls -1 /a/dir/*/dir/* > textfile

所有选定文件的扩展名均为 .[az]{3}

(我需要这个的原因是因为我需要一个唯一的基本名称列表,并将unique在此步骤之后解决这个问题)

答案1

我总是喜欢包含仅 bash 的解决方案:

for file in /a/dir/*/dir/*; do
    echo "${file%.*}" >> ~/file_list
done

并使用可选的 if 语句将文件限制为您请求的扩展名:

shopt -s extglob
for file in /a/dir/*/dir/*; do
    if [[ "$file" =~ \.[a-zA-Z]{3}$ ]]; then
        echo "${file%.*}" >> ~/file_list
    fi
done

这个类似的服务器故障问题我解释一下“${file%.*}”参数扩展。

答案2

类似这样的操作会列出当前目录中的文件并删除第一个点之后的所有内容。

find . -maxdepth 1 -type f | xargs -iZ basename Z | cut -d"." -f1 > /tmp/resultfile

最终,隐藏文件会导致结果文件中出现空白行。Basename 仅用于删除以“./”开头的文件名寻找结果。

答案3

怎么样:

ls -1 /a/dir/*/dir/* | sed -e 's/\.[a-zA-Z0-9]\{3\}$//'

應該做你想做的事。

答案4

更通用的答案是找到任意长度的扩展:

find . -type f | sed 's/^.*\.\([^.]*\)$/\1/'

然后我使用以下命令获取目录中的扩展列表:

find . -type f | sed 's/^.*\.\([^.]*\)$/\1/' | sort | uniq -c | sort -n

相关内容