![find 命令以及 grep 和 mv](https://linux22.com/image/123678/find%20%E5%91%BD%E4%BB%A4%E4%BB%A5%E5%8F%8A%20grep%20%E5%92%8C%20mv.png)
我的 SRC 文件夹中有很多文件。我想将遵循特定模式的所有文件从该 SRC 文件夹移动到另一个 DST 文件夹,并使用所需的扩展名重命名该文件。
示例参数
SRC目录/Vinodh
文件夹中的文件/Vinodh
有TEST01
, TEST02
, TEST03
,TEST04
TEST02
&TEST03
包含单词WORLD
夏令时目录/TEST
我想将TEST02
&TEST03
文件移动到/TEST
文件夹中作为TEST02.txt
andTEST03.txt
我将输入命令为
cd /Vinodh
grep -l 'WORLD' *TEST*
mv TEST02 /TEST
mv TEST03 /TEST
cd /TEST
mv TEST02 TEST02.txt
mv TEST03 TEST03.txt
我想将所有这些合并到单行语句中,或者使用批处理文件一次性复制所有文件。
答案1
使用 GNU 工具:
grep -D skip -d skip -lZ WORD /Vinodh/*TEST* | xargs -r0 mv -vt /TEST
请注意,如果其中一些文件是符号链接,则移动它们可能会破坏链接。
GNUgrep
可以使用 跳过设备/fifos -D skip
,使用 跳过目录-d skip
,但没有选项可以跳过符号链接。您需要一个 shell,其中 glob 可以指定文件类型,例如zsh
:
grep -lZ WORD /Vinodh/*TEST*(.) | xargs -r0 mv -vt /TEST
只会看看常规的文件。
另一种方法是使用find
:
LC_ALL=C find /Vinodh/. ! -name . -prune \
! -name '.*' -type f -name '*TEST*' -exec grep -lZ WORD {} + |
xargs -r0 mv -t /TEST
如果你没有 GNU 工具,还有 POSIX 变体:
LC_ALL=C find /Vinodh/. ! -name . -prune \
! -name '.*' -type f -name '*TEST*' -exec grep -q {} \; \
-exec mv {} /TEST/ \;
答案2
使用 循环文件for f...
,然后将其包裹mv
在条件条件中(参见例如测试和条件在 BashGuide 上):
cd /Vinodh
for f in *TEST* ; do
if grep -q WORLD "$f" ; then
mv "$f" "/TEST/$f.txt"
fi
done
答案3
假设您的 shell 是 Bash:
source_directory='/Vinodh'
destination_directory='/TEST'
for file in "$source_directory/"*; do
renamed_file="$(basename "$file")"
if grep -q 'WORLD' "$file"; then
echo "Moving \"$file\" to \"$destination_directory/${renamed_file%.*}.txt\""
mv "$file" "$destination_directory/${renamed_file%.*}.txt"
fi
done
- 迭代 中的所有文件
$source_directory
。 - 提取文件名(最后一个之后的部分
/
)。 WORLD
在文件中查找字符串;grep -q
是quiet,也就是说,它只是设置退出代码,并不打印它做了什么。- 如果在文件中找到该字符串,则将其移动到
$destination_directory
用.txt
.
答案4
grep -li "world" /Vinodh/* | awk '{print "mv" " " $1 " " "/TEST/"}' | sh