我有一个名为log.txt的文本文件,它记录了文件名和从中获取的路径。像这样
2.txt
/home/test/etc/2.txt
基本上是文件名及其先前位置。我想使用grep来抓取文件目录,将其另存为变量,然后将文件移回其原始位置。
for var in "$@"
do
if grep "$var" log.txt
then
# code if found
else
# code if not found
fi
这只是将2.txt及其目录打印到控制台,因为该目录中包含2.txt。
谢谢。
答案 0 :(得分:1)
也许会翻转逻辑以提高效率?
f=''
while read prev
do case "$prev" in
*/*) f="${prev##*/}"; continue;; # remember the name
*) [[ -e "$f" ]] && mv "$f" "$prev";;
done < log.txt
它将遍历日志中的所有文件,如果它们在本地存在,请将其移回。在功能上应该相同,每个文件都没有grep
。
如果名称始终相同,那么为什么要将其全部保存在日志中?
如果是,那么
while read prev
do f="${prev##*/}" # strip the path info
[[ -e "$f" ]] && mv "$f" "$prev"
done < <( grep / log.txt )
答案 1 :(得分:0)
将文件名放在同一行将大大简化脚本。但也许尝试类似
byte[]
通过将# Convert from command-line arguments to lines
printf '%s\n' "$@" |
# Pair up with entries in file
awk 'NR==FNR { f[$0]; next }
FNR%2 { if ($0 in f) p=$0; else p=""; next }
p { print "mv \"" p "\" \"" $0 "\"" }' - log.txt |
sh
替换为sh
进行测试,看看会得到什么。如果看起来正确,请切换回去。
简而言之,cat
可能会带来类似的结果,但最终您必须解析输出以将输出线配对。
答案 2 :(得分:0)
另一种解决方案:
for f in `grep -v "/" log.txt`; do
grep "/$f" log.txt | xargs -I{} cp $f {}
done
答案 3 :(得分:-1)
grep -q
(用于“安静”)停止输出