私のSRCフォルダにはたくさんのファイルがあります。特定のパターンに従うすべてのファイルをこのSRCフォルダから別のDSTフォルダに移動し、ファイル名を目的の拡張子に変更したいと思います。
例パラメータ
SRCディレクトリ/Vinodh
フォルダ内のファイルに/Vinodh
はTEST01
、、、、TEST02
TEST03
TEST04
TEST02
&TEST03
単語を含めるWORLD
夏時間ディレクトリ/TEST
TEST02
&TEST03
ファイルを/TEST
フォルダに移動したいですTEST02.txt
。TEST03.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
- 繰り返しのすべてのファイル
$source_directory
。 - ファイル名(最後の名前の後の部分
/
)を抽出します。 WORLD
ファイル内の文字列を見つけます。grep -q
はいキューつまり、終了コードのみを設定し、実行した内容は印刷しません。$destination_directory
ファイルで文字列が見つかった場合.txt
。
答え4
grep -li "world" /Vinodh/* | awk '{print "mv" " " $1 " " "/TEST/"}' | sh