find 命令以及 grep 和 mv

find 命令以及 grep 和 mv

我的 SRC 文件夹中有很多文件。我想将遵循特定模式的所有文件从该 SRC 文件夹移动到另一个 DST 文件夹,并使用所需的扩展名重命名该文件。

示例参数

SRC目录/Vinodh

文件夹中的文件/VinodhTEST01, TEST02, TEST03,TEST04

TEST02&TEST03包含单词WORLD

夏令时目录/TEST

我想将TEST02&TEST03文件移动到/TEST文件夹中作为TEST02.txtandTEST03.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
  1. 迭代 中的所有文件$source_directory
  2. 提取文件名(最后一个之后的部分/)。
  3. WORLD在文件中查找字符串;grep -qquiet,也就是说,它只是设置退出代码,并不打印它做了什么。
  4. 如果在文件中找到该字符串,则将其移动到$destination_directory.txt.

答案4

grep -li "world" /Vinodh/* | awk '{print "mv" " " $1 " " "/TEST/"}' | sh

相关内容