У меня есть куча каталогов с тысячами файлов различных типов:
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
Что-то вроде этого с 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
)
Я заключил его в (), так что он восстанавливает текущий каталог. Уберите "echo" перед "mkdir" и "mv", если это работает так, как задумано.