コマンドを探し、grepとmvを見つけます。

コマンドを探し、grepとmvを見つけます。

私のSRCフォルダにはたくさんのファイルがあります。特定のパターンに従うすべてのファイルをこのSRCフォルダから別のDSTフォルダに移動し、ファイル名を目的の拡張子に変更したいと思います。

例パラメータ

SRCディレクトリ/Vinodh

フォルダ内のファイルに/VinodhTEST01、、、、TEST02TEST03TEST04

TEST02TEST03単語を含めるWORLD

夏時間ディレクトリ/TEST

TEST02TEST03ファイルを/TESTフォルダに移動したいですTEST02.txtTEST03.txt

次のようにコマンドを入力します。

cd /Vinodh
grep -l 'WORLD' *TEST*
mv TEST02 /TEST
mv TEST03 /TEST
cd /TEST
mv TEST02 TEST02.txt
mv TEST03 TEST03.txt

これらすべてを1行の文にまとめるか、バッチファイルを使用してすべてのファイルを一度にコピーしたいと思います。

答え1

GNUツールの使用:

grep -D skip -d skip -lZ WORD /Vinodh/*TEST* | xargs -r0 mv -vt /TEST

これらのファイルの一部がシンボリックリンクの場合、そのファイルを移動するとリンクが失われる可能性があります。

GNUはgrepデバイス/ fifosスキップを使用でき、-D skipディレクトリスキップを使用できますが、-d skipシンボリックリンクをスキップするオプションはありません。 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

シェルが 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 -qはいキューつまり、終了コードのみを設定し、実行した内容は印刷しません。
  4. $destination_directoryファイルで文字列が見つかった場合.txt

答え4

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

関連情報