Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell 使用| symble时在Unix命令行中传递参数_Shell_Unix_Parameters_Command_Ls - Fatal编程技术网

Shell 使用| symble时在Unix命令行中传递参数

Shell 使用| symble时在Unix命令行中传递参数,shell,unix,parameters,command,ls,Shell,Unix,Parameters,Command,Ls,我正在尝试将图片目录中的所有视频文件移动到电影目录。顺便说一下,这是在Mac电脑上 我想我可以用ls-R简单地递归我所有的图片目录 然后我把它传给grep-I.avi这给我所有的电影文件 现在我将这些值通过管道传输到mv-n$1~/Movies,我希望它能将文件移动到Movies文件夹中 我有几个问题。 1.在列出文件时,ls-R不会列出路径。所以我想我可能无法移动文件。 2.我似乎无法在mv命令中获得分配给$1的文件名 总之,我的命令是这样的:注意,我是从~/Pictures运行这个命令的 l

我正在尝试将图片目录中的所有视频文件移动到电影目录。顺便说一下,这是在Mac电脑上

我想我可以用ls-R简单地递归我所有的图片目录

然后我把它传给grep-I.avi这给我所有的电影文件

现在我将这些值通过管道传输到mv-n$1~/Movies,我希望它能将文件移动到Movies文件夹中

我有几个问题。 1.在列出文件时,ls-R不会列出路径。所以我想我可能无法移动文件。 2.我似乎无法在mv命令中获得分配给$1的文件名

总之,我的命令是这样的:注意,我是从~/Pictures运行这个命令的

ls -R | grep -i ".avi" | mv -n $1 ~/Movies 
因此,现在我不确定哪个部分出现故障,但我确实收到了以下错误:

usage: mv [-f | -i | -n] [-v] source target
   mv [-f | -i | -n] [-v] source ... directory
如果我删除“mv”命令,我会得到一个不带路径的avi文件列表。示例如下:

4883.AVI
4884.AVI
4885.AVI
4886.AVI
4887.AVI
...
任何人都知道如何在“ls”中获取路径,或者如何在“|”命令之间传递值


谢谢。

您可以通过多种方式实现这一点,我的openion中有一种:

ls -R | grep -i ".avi" | while read movie
do
  echo " moving $movie"
  mv $movie ~/Movies/
done

最好使用find命令:

使用反勾号

mv `ls *.avi` ~/Movies
bash for循环可以帮助您轻松找到所有avi文件

shopt -s nullglob
for file in *.avi
do
   mv "$file" "$file"  ~/Movies/"$file"
done

您应该像这样创建simple copy.sh

#!/bin/bash
cp $1 ~/Movies/

一个run命令。/copy.sh$ls | grep avi

您得到了这个错误,因为这里$1的值为NULL,所以命令mv-its就像您只传递了一个值一样。因此,它说您需要同时传递源和目标。谢谢您,我将完成这一步。我相信你们都给了我所需要的。再次感谢!!别忘了接受对你帮助最大的答案。快乐学习。@chepner:请你解释一下原因。不要这样使用ls。这不是递归的,但你可以使用shopt-s globstar;用于bash 4或更高版本中**/*.avi中的文件。
#!/bin/bash
cp $1 ~/Movies/