我当前正在使用以下命令:
grep -l -Z -E '.*?FindMyRegex' /home/user/folder/*.csv | xargs -0 -I{} mv {} /home/destination/folder
这很好。问题在于它在整个文件上使用grep
。
我只想在文件的第一行上使用grep
命令。
我一开始尝试使用head -1 file |
,但是没有用。
答案 0 :(得分:1)
我要添加到脚本中的更改是-
for file in *.csv; do
head -1 "$file" | grep -l -Z -E '.*?FindMyRegex' | xargs -0 -I{} mv {} /home/destination/folder;
done
答案 1 :(得分:0)
您也许可以尝试sed '1q' file.csv | grep ...
仅在第一行中搜索正则表达式。
答案 2 :(得分:0)
gawk 'FNR==1{if($0~/PATTERN/)
printf "mv %s %s\n",FILENAME, "/target";nextfile}' /path/*.csv
.*?FindMyRegex
.*?
没有任何意义,可以将其删除。上面的awk(gawk)单行代码将为您建立mv file target
命令行。您可以检查它们,如果对它们满意,则将输出通过管道传递到|sh
,将执行命令。
用正则表达式模式替换PATTERN
,用实际目标目录替换/target
。
一种情况是假设文件名不包含特殊字符(即空格),如果是,请将"
s添加到mv
cmd中。
答案 3 :(得分:0)
您不需要grep
或find
,只要您的文件没有嵌入换行符即可。
我不知道让sed
用空值定界的简单方法。
mv $( for f in /home/user/folder/*.csv;
do sed -ns '1 { /yourPattern/F; q; }' $f;
done ) /home/destination/folder/
编辑
用循环重写。这将运行sed
的单独实例来检查每个文件,但是至少不应在第一行之外读取它。如果没有匹配,则 会在语法上失败。
您可能需要-E
,具体取决于您的正则表达式。
-n
说不要从文件中打印记录。
-s
说,将每个文件都当作一个单独的输入-这样文件名并不总是第一个。
确实需要sed
使用GNU F
。
答案 4 :(得分:0)
使用GNU awk查找文件名,将文件名通过管道传递到xargs
<s:form action="RegTeacher" method="Update" theme="simple" >
如果看起来还可以,请删除“回声”
答案 5 :(得分:0)
尝试使用Shellcheck干净的Bash代码:
#! /bin/bash
shopt -s nullglob # Globs that match nothing expand to nothing
shopt -s dotglob # Globs match files whose names start with '.'
dest=/home/destination/folder
for file in *.csv ; do
head -n 1 -- "$file" | grep -qE '.*?FindMyRegex' && mv -- "$file" "$dest"
done
shopt -s nullglob
个文件,.csv
可以防止错误。shopt -s dotglob
确保名称以“。”开头的文件。被处理。--
和head
选项中的mv
确保正确处理名称以-
开头的文件。"$file"
和"$dest"
中的引号确保正确处理包含空格(实际上为$IFS
)字符(包括换行符)或glob元字符的名称。请注意,规则表达式中的.*?
可能是多余的,并且可能无法执行您认为的操作(grep -E
不会进行非贪婪匹配)。