我试图将 for 循环中一个变量的内容存储在另一个变量中,但我得到
0403-006 Execute permission denied
帮助。
while IFS='|' read -r col1 col2 col3 col4 col5 col6 col7
do
for f in directory/*
do
files=$($f | awk -F "_" '{print $3}')
echo $files
done
done <test.txt
我拥有运行此程序的完全权限,当我放入 echo $files 时出现错误
答案1
非常不清楚你的脚本在做什么,而且看起来完全写错了。您需要提供更多详细信息,以找出到底出了什么问题以及您想要实现的目标。我的猜测是错误来自这一行:
files=$($f | awk -F "_" '{print $3}')
特别是,您需要了解这里发生的情况:
$f | awk -F "_" '{print $3}'
您正在执行$f
,这是文件之一directory/*
。其中之一是0403-006
,你无法执行它。
变量col1
、col2
等呢?读取的数据test.txt
完全未使用。
提供一个带有输入数据和预期输出的最小且完整的示例,因为即使我的猜测是正确的,该脚本看起来也不正常。
答案2
看着你自己的答案,更清楚您实际上想要做什么。
以下是我自己的看法:
#!/bin/sh
dupsfile='/archival/test/sppark/dataindex/staging/duplicates.txt'
indir='/archival/test/sppark/datapdf/staging/renamedTriage'
baddir='/archival/test/sppark/datapdf/staging/badFiles'
dups=$( mktemp )
cut -d '|' -f 4 <"$dupsfile" >"$dups"
for pathname in "$indir"/*; do
[ ! -f "$pathname" ] && continue
string=$( printf '%s\n' "${pathname##*/}" | cut -d '_' -f 4 )
if grep -qxF "$string" "$dups" then
echo mv "$pathname" "$baddir"
fi
done
rm "$dups"
您自己的答案与此之间的区别在于文件列表仅生成一次,而不是数据文件中的每行生成一次。
数据文件的解析方式是|
提取其第四个分隔列并将其保存到临时文件中。对于您正在调查的目录中的每个文件,都会使用grep
.如果该临时文件中存在文件名的第四个_
分隔位,则文件将被移动。删除echo
以实际移动文件。
答案3
我已经修改了我的脚本以完全按照我想要的方式进行
while IFS='|' read -r col1 col2 col3 col4 col5 col6 col7
do
for f in /archival/test/sppark/datapdf/staging/renamedTriage/*
do
files=$(echo "$f" | awk -F "_" '{print $4}')
if [[ $col4 == $files ]]; then
mv $f /archival/test/sppark/datapdf/staging/badFiles/
fi
done
done </archival/test/sppark/dataindex/staging/duplicates.txt
我的 while 循环读取我的 txt 文件,读取由 | 分隔的每一列。我有一个 for 循环来循环遍历我的目录中的每个文件,如果 my$col4
与 相同$files
,那么它会将文件移动到我指定的目录