bash中每个迭代项的访问值

bash中每个迭代项的访问值

.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

相关内容