다양한 파일 유형의 수천 개의 파일을 포함하는 수많은 디렉토리가 있습니다.
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를 한 번 호출하면 mv
이를 방지할 수 있지만 xargs
여러 번 호출하면 문제가 될 수 있습니다.)
답변2
쉘/배시는 다음과 같습니다:
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
)
현재 디렉터리를 복원하도록 ()로 묶습니다. 예상대로 작동하면 "mv" 앞에 있는 "mkdir" 및 "echo"를 제거하십시오.