如何将find命令获取的文件名列表逐行写入文件以支持排序?
解决方法
原代码的问题
- 语法错误:for循环缺少
do和done关键字,且行尾多了多余的冒号,正确的循环结构必须包含do和done。 - 文件名分割问题:直接用
for var in $x会根据系统默认的IFS(空格、制表符、换行符)分割变量内容,遇到带空格的文件名时,会被拆成多个循环项,导致写入文件的内容错误。 - 换行输出错误:
echo $var\n不会解析转义字符\n,无法实现换行效果,且未给变量加引号会导致文件名中的特殊字符被解析。
正确的实现方式
方式1:直接通过管道完成查找+排序(最简洁可靠)
不需要存储变量,一步到位生成排序后的文件:
find ./directory -type f -exec basename '{}' \; | sort > sorted_files.txt
如果要先写入未排序的文件再排序:
# 写入未排序文件 find ./directory -type f -exec basename '{}' \; > files.txt # 原地排序文件 sort -o files.txt files.txt
方式2:修正for循环(仅适用于文件名无空格的场景)
如果坚持用变量和for循环,需要修正语法并给变量加引号:
x=$(find ./directory -type f -exec basename '{}' \;) for var in "$x"; do echo "$var" >> files.txt done # 排序文件 sort -o files.txt files.txt
注意:此方式在文件名包含空格时仍会出问题,不推荐用于通用场景。
方式3:用while循环处理(支持带空格的文件名)
通过read命令逐行读取变量内容,避免文件名被错误分割:
x=$(find ./directory -type f -exec basename '{}' \;) echo "$x" | while read -r var; do echo "$var" >> files.txt done # 排序文件 sort -o files.txt files.txt
或者直接跳过变量存储,用管道连接find和while:
find ./directory -type f -exec basename '{}' \; | while read -r var; do echo "$var" >> files.txt done sort -o files.txt files.txt
内容的提问来源于stack exchange,提问作者hwalz
相关产品推荐
相关产品推荐

