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
相关产品推荐
相关产品推荐

