You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bash脚本问题:如何获取遍历文件完整路径以删除Emacs临时文件

如何在Bash脚本中获取带完整路径的Emacs临时文件并删除?

我正尝试编写一个Bash脚本,删除所有以'~'结尾的文件(即Emacs临时文件)。目前我的脚本如下:

#!/bin/bash
for f in $(ls -R)
do
    if [ ${f: -1} == '~' ]
    then
        rm $f
    fi
done

该脚本能从根目录定位到所有符合后缀要求的文件,在当前目录下运行正常,但问题在于rm仅收到文件名而非完整路径,因此无法删除子目录中的对应文件。请问在遍历文件时如何获取其完整路径?

其实你遇到的问题核心是用ls -R输出的结果只有文件名,没有路径信息,而且这种写法本身还有不少坑(比如文件名带空格直接就会出错)。给你几个更靠谱的解决方案:

方案一:用find命令直接处理(最推荐)

find天生就是用来递归查找文件的,既能输出完整路径,还能直接执行删除操作,完全不用自己写循环:

#!/bin/bash
# 从当前目录开始递归查找所有以~结尾的文件并直接删除
find . -type f -name "*~" -delete
  • -type f:只匹配文件,避免误删名字带~的目录
  • -name "*~":精准匹配所有以~结尾的文件名
  • -delete:直接删除找到的文件,安全又省心

如果想先预览要删除的文件,确认没问题再执行删除,可以去掉-delete换成-print:

find . -type f -name "*~" -print

方案二:如果一定要手动循环遍历(不推荐,但满足需求)

要是你坚持要自己写循环处理,那可以用find配合while read来获取完整路径,还能避开空格、特殊字符的坑:

#!/bin/bash
find . -type f -name "*~" | while read -r file_path
do
    # 这里的file_path就是完整路径,直接用rm即可
    rm "$file_path"
done

read -r是为了正确处理文件名里的反斜杠,给file_path加双引号则是为了兼容带空格、特殊字符的文件名。

为什么你的原脚本不行?

原脚本里ls -R递归输出的内容,子目录下的文件只会显示文件名,不会带路径。比如子目录subdir里的test.txt~,ls -R只会输出test.txt~而非./subdir/test.txt~,所以rm找不到对应文件。另外for f in $(ls -R)这种写法,一旦文件名有空格就会被拆成多个变量,根本没法正确处理。

内容的提问来源于stack exchange,提问作者user8920191

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:48:07