Shell 如何复制具有行号的文件>;100到其他文件夹
我想将包含100行或更多行的文件复制到另一个文件夹:Shell 如何复制具有行号的文件>;100到其他文件夹,shell,file,unix,copy,Shell,File,Unix,Copy,我想将包含100行或更多行的文件复制到另一个文件夹: $ cd "/home/john/folder a" $ wc -l * 10 file1.txt 50 file2.txt 100 file3.txt 150 file4.txt 我想将文件file3.txt和file4.txt(具有100行或更多行的文件)复制到文件夹/home/john/folder b 有人能帮我吗?非常感谢。试试这个: declare -i numfile for f in *; do numfile=$(
$ cd "/home/john/folder a"
$ wc -l *
10 file1.txt
50 file2.txt
100 file3.txt
150 file4.txt
我想将文件file3.txt
和file4.txt
(具有100行或更多行的文件)复制到文件夹/home/john/folder b
有人能帮我吗?非常感谢。试试这个:
declare -i numfile
for f in *; do
numfile=$([ -f "$f" ] && cat "$f" | wc -l )
[ $numfile -ge 100 ] && cp "$f" otherdir
done
对于当前目录中的每个文件,numfile
被分配文件的行数
如果numfile
大于或等于100,文件将复制到otherdir
编辑:
正如William Pursell所提到的,一种更可靠的方法是在执行比较和复制命令之前测试项目是否为文件:
for f in *; do
if [ -f "$f" ]; then
[ "$(wc -l < $f)" -ge 100 ] && cp "$f" otherdir;
fi
done
用于f in*;做
如果[-f“$f”];然后
[“$(wc-l<$f)”-通用电气100]&&cp“$f”其他目录;
fi
完成
试试这样的方法(POSIX sh):
我鼓励您一行一行地完成此任务,了解脚本的每个部分是如何工作的,以帮助您在将来完成类似的任务
我将在这里解释一些事情:
只提供文件的行数,不提供文件名wc-l<“$file”
- 如果文件中至少有100行,
为真[“$LINES”-ge 100]
将一行输出为标准错误,而不是标准输出echo“…”>&2
复制文件,同时保留其所有属性,如所有者、权限和修改时间cp-a
- 确保引用所有变量,除非您有充分的理由不引用,以防止出现空格问题
- 这里还有一个:
# Assuming that we are in source folder ...
cp $(wc -l *|grep -Eo '[0-9]{3,} (.*)'|head -n -1|cut -d ' ' -f 2) /dev/null "/home/john/folder b"
head
删除由wc
打印的总行,/dev/null
处理没有任何文件与标准匹配的情况
当然,这个解决方案——正如这里介绍的其他解决方案一样——会让您遇到问题,如果您的源目录包含那么多文件,那么将超过最大命令行长度。我想您的答案肯定比我的更切题:)将numfile声明为整数听起来很糟糕。例如,如果测试反转为复制少于100行的文件,这将尝试复制目录。可能更安全的做法是在进行numfile赋值的行末尾追加
&&
,或者为f in*写入;执行测试-f“$f”和测试“$(wc-l<$f)”-ge 100和cp“$f”/path;完成
什么是[-f“$f”]意思?@Jiangty[-f“$f”]
是一项测试,用于检查分配给“$f”
变量的项是否为常规文件:-f
。查看更多信息:不需要管道来获取管线计数wc-l我喜欢这个想法,但是使用正则表达式匹配进行数值比较似乎很脆弱。可能更容易做到wc-l*|awk'$1>100{print$2}'…
目录仍然存在问题。在我的解决方案中,目录被隐式忽略。我也不认为正则表达式与数字匹配有问题,除了一个(轻微的病理情况),我的方法会失败:想象一个名为200xx
的文件(即名称以一个三位数字开头,并嵌入一个空格);使用我的解决方案,即使文件少于100行,也会复制该文件。当然,谁会创建名称中带有嵌入空格的文件…;-)
#!/bin/bash
SOURCE_FOLDER="/home/john/folder a"
COPY_TO="/home/john/folder b"
for dir in "$SOURCE_FOLDER" "$COPY_TO"; do
if [[ ! -d "$dir" ]]; then
echo "Directory ${dir} does not exist." >&2
exit 1
fi
done
if [[ -z "$(ls -A "$SOURCE_FOLDER")" ]]; then
echo "Directory '${SOURCE_FOLDER}' is empty." >&2
exit 1
fi
for file in "$SOURCE_FOLDER"/*; do
LINES="$(wc -l < "$file"')"
echo "File ${file} has ${LINES} lines..."
if [[ "$LINES" -ge 100 ]]; then
echo "Copying ${file}..."
cp -a "$file" "${COPY_TO}/"
fi
done
$ mkdir "folder a"
$ mkdir "folder b"
$ chmod +x script.sh
$ cd folder\ a/
$ seq 1 1000 > file1.txt
$ seq 1 1000 > file2.txt
$ seq 1 100 > file4.txt
$ seq 1 100 > file3.txt
$ seq 1 99 > file4.txt
$ seq 1 1 > file5.txt
$ seq 1 20 > file6.txt
$ cd ..
$ ./script.sh
File /.../dev/scratch/stack/folder a/file1.txt has 1000 lines...
Copying /.../dev/scratch/stack/folder a/file1.txt...
File /.../dev/scratch/stack/folder a/file2.txt has 1000 lines...
Copying /.../dev/scratch/stack/folder a/file2.txt...
File /.../dev/scratch/stack/folder a/file3.txt has 100 lines...
Copying /.../dev/scratch/stack/folder a/file3.txt...
File /.../dev/scratch/stack/folder a/file4.txt has 99 lines...
File /.../dev/scratch/stack/folder a/file5.txt has 1 lines...
File /.../dev/scratch/stack/folder a/file6.txt has 20 lines...
# Assuming that we are in source folder ...
cp $(wc -l *|grep -Eo '[0-9]{3,} (.*)'|head -n -1|cut -d ' ' -f 2) /dev/null "/home/john/folder b"