我有大量目录,其中包含数千个各种文件类型的文件:
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
(请注意,这可能会导致同名文件相互覆盖。单次调用 GNUmv
可以防止这种情况,但如果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”。