我需要将以字母 b 开头的目录中的前 3 个文件按字母顺序移到另一个目录中。我想出了这个命令:
find /users/students/ejackson/A3-ejackson-55688-114906/CS282in \
-name "b*" | sort | head -3
它生成了正确的文件,但我无法对它们进行任何操作。理想情况下,我只需将上述命令的输出通过管道传输到mv
,但我认为这是不可能的。
(PS:我必须在没有grep
、sed
或 的情况下完成此操作awk
)
答案1
find
您可以利用for
按顺序循环遍历文件的事实,而不是解析输出(非常糟糕的想法):
i=0; for b in /path/to/files/b*; do (( ++i < 4 )) && echo mv -v -- "$b" /path/to/destination; done
测试后删除echo
,以实际移动文件。
下面是带有丑陋注释的内容:
# set a variable to 0 so we can increment it
i=0
# glob for the files starting with b
for b in /path/to/files/b*; do
# test how many times the loop has been run and if it's less than 4...
(( ++i < 4 )) &&
# ... then move the files*
echo mv -v -- "$b" /path/to/destination
done
*这不会发生,直到你echo
从行首删除 - 相反它会回显哪些文件将被移动以及移动到哪里(扩展每次迭代的变量)
我不知道这在 tcsh 中是否有效,但它在 bash 中有效,因此可能会帮助其他主要使用 bash 的 Ubuntu 用户
答案2
答案3
您提到您正在使用tcsh
。C-Shell 系列与 Bourne shell 不兼容。此命令可能有效:
set THREE_FILES=`find …`
cp $THREE_FILES NEW_DIRECTORY
第一个set
命令创建一个名为 的新环境变量THREE_FILES
,并将输出保存到该变量中。cp
获取三个文件并将它们复制到NEW_DIRECTORY
。