让我们说我有一个文件myfile.csv
。在此文件中,我有一个像这样的列表:
black
white
grey
orange
red
我希望任何行都将是一个变量,并使用该名称将该变量输入到目录中。
示例:
for i in $( myfile.csv ); do
cd /directory/$i && cat anotherfile.txt
它不起作用。我会很高兴为您提供帮助。:)
答案 0 :(得分:2)
您无需输入目录即可保存所包含的文件。遍历文件的所有行是while
和read
的工作:
while IFS= read -r dir; do
if [[ -f "$dir/anotherfile.txt" ]]; then
cat "$dir/anotherfile.txt"
else
printf 'WARNING: %s not found\n' "$dir/anotherfile.txt"
fi
done < myfile.csv
当然,仅当您的myfile.csv
文件每行具有一个目录名称时,此方法才有效...
答案 1 :(得分:2)
在shell脚本中,通常可以通过巧妙地使用可用命令来避免显式循环。大多数命令(包括cat
)都接受多个文件名。而且,如果您想在文件的每一行上运行命令,请考虑使用xargs
。
xargs -a myfile.csv -d '\n' -I {} cat /directory/{}/anotherfile.txt
这将对cat /directory/{}/anotherfile.txt
的每一行运行myfile.csv
,其中花括号用输入行替换。
--delimiter=delim, -d delim
输入项目以指定字符终止。指定的分隔符可以是单个字符,C型字符转义符(例如
\n
或八进制或十六进制的转义码。)
-a file, --arg-file=file
从文件而不是标准输入中读取项目。如果你用这个 选项,运行命令时标准输入保持不变。除此以外, 从
/dev/null
重定向标准输入。
-I replace-str
用初始参数替换 replace-str 的出现 名称从标准输入中读取。另外,未引用的空白不 终止输入项;相反,分隔符是换行符。 表示
-x
和-L 1
。