さまざまなファイルタイプの何千ものファイルを含むディレクトリが大量にあります。
dir
|__ subdir
| |__ file.foo
| |__ file.bar
| |__ file.txt
| |__ (...)
|__ (...)
すべてのサブディレクトリからすべての.txtを移動する高速で効率的な方法は何ですか2行以上のファイル他の選択されたディレクトリへ?
答え1
GNU システムの場合:
find dir -type f -name '*.txt' -exec awk '
FNR == 2 {printf "%s\0", FILENAME; nextfile}' {} + |
xargs -r0 mv -t newdir
(同じ名前のファイルが互いに上書きされる可能性があることに注意してください。GNU を 1 回呼び出すと、mv
これを防ぐことができますが、xargs
複数回呼び出すと、問題が発生する可能性があります)。
答え2
shell / bash では次のようになります:
move_files_with_line_count()
(
srcdir="$1"
destdir="$2"
suffix="$3"
minlines="$4"
cd "$srcdir"
find . -name "*$suffix" -type f -print0 \
| while read -r -d $'\0' file; do
linecnt=$(wc -l "$file" | { read a b; echo $a; }; )
if [ $linecnt -ge $minlines ]; then
[ -d "$destdir/${file%/*}" ] \
|| echo mkdir -p "$destdir/${file%/*}"
echo mv -v "$file" "$destdir/$file"
fi
done
)
現在のディレクトリを復元するために、() で囲みました。意図したとおりに動作する場合は、「mkdir」と「mv」の前の「echo」を削除してください。