将目录中以特定字母开头的前 n 个文件按字母顺序复制到另一个目录中

将目录中以特定字母开头的前 n 个文件按字母顺序复制到另一个目录中

我需要将以字母 b 开头的目录中的前 3 个文件按字母顺序移到另一个目录中。我想出了这个命令:

find /users/students/ejackson/A3-ejackson-55688-114906/CS282in \
  -name "b*" | sort | head -3

它生成了正确的文件,但我无法对它们进行任何操作。理想情况下,我只需将上述命令的输出通过管道传输到mv,但我认为这是不可能的。

(PS:我必须在没有grepsed或 的情况下完成此操作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

你可以获取文件列表并通过 shell 脚本中的 for 循环来处理它们,或者你也可以在命令行上处理它们(这样会更难读取)

查看此文章nixCraft另一个教程也一样。

你应该可以做类似的事情

for f in `find /users/students/ejackson/A3-ejackson-55688-114906/CS282in -name "b*" | sort | head -3`
do
    cp $f [target]
done

答案3

您提到您正在使用tcsh。C-Shell 系列与 Bourne shell 不兼容。此命令可能有效:

set THREE_FILES=`find …`
cp $THREE_FILES NEW_DIRECTORY

第一个set命令创建一个名为 的新环境变量THREE_FILES,并将输出保存到该变量中。cp获取三个文件并将它们复制到NEW_DIRECTORY

相关内容