.xz
我有遍历目录的代码,并找到带有扩展名的所有文件
问题是我似乎无法弄清楚如何访问每个迭代文件,.xz
而是获取ROOTPATH
.我究竟做错了什么?
ROOTPATH='/home/user/path'
for file in "$ROOTPATH"; do
find $PWD -name '*.xz'
echo "file is $file"
done
这会输出如下文件:
/home/user/path/file1.tar.xz
/home/user/path/file2.tar.xz
然后该echo
部分打印:
file is /home/user/path
我如何访问每个迭代项目,例如
/home/user/path/file1.tar.xz
/home/user/path/file2.tar.xz
谢谢
答案1
您没有使用 glob*.xz
来匹配路径中的文件,当您这样做时,您甚至不需要该find
命令。做就是了
ROOTPATH="/home/user/path"
for file in "$ROOTPATH"/*.xz; do
[ -f "$file" ] || continue
printf "%s\n" "$file"
done
这*.xz
是一个标准的全局模式,用于匹配.xz
指定路径中具有扩展名的所有文件。这[ -f "$file" ] || continue
只是当 glob 返回空结果(即未找到文件时)时优雅地处理循环退出所需的健全性检查。
如果您偶然也在子目录下查找文件,请启用扩展 shell 通配选项globstar
以启用文件名的递归匹配,然后执行
shopt -s globstar nullglob
for file in "$ROOTPATH"/**/*.xz; do
printf "%s\n" "$file"
done
答案2
您不应该迭代结果find
,请参阅为什么循环查找的输出是不好的做法?
相反,从内部调用您的脚本find
:
find "$ROOTPATH" -type f -name '*.xz' \
-exec sh -c 'for n; do printf "Got name %s\n" "$n"; done' sh {} +
或者,调用单独的脚本:
find "$ROOTPATH" -type f -name '*.xz' \
-exec /some/path/script.sh {} +
该脚本可能如下所示:
#!/bin/sh
for name; do
# do something with "$name"
done
在这种情况下,无论是嵌入sh -c
(或者bash -c
如果需要bash
)还是单独的脚本,都将使用尽可能多的.xz
文件来调用(如果文件数量为数百个,则可能会调用多次)。该for name
循环将迭代找到的名称,您可以使用$name
(当然,正确引用)对各个文件执行您需要执行的任何操作。
答案3
在 for 循环本身中使用 find:
ROOTPATH="/home/user/path"
for file in `find $ROOTPATH -type f -name *.xz -print`
do
echo "file is $file"
done