我正在尝试从终端移动文件,但只是那些来自grep查询结果的文件。
ls -l | grep -i s02 | mv
完成上述命令的最佳方法是什么?
我正在尝试从终端移动文件,但只是那些来自grep查询结果的文件。
ls -l | grep -i s02 | mv
完成上述命令的最佳方法是什么?
cd directory/containing/the/files
mv *[sS]02* /path/to/target/
对于更复杂的操作,还可以使用find来查找所有相关文件。你问题中的示例也可以写成:
cd directory/containing/the/files
find . -type f -maxdepth 1 -iname '*s02*' -exec mv {} /path/to/target/directory/ \;
值得看一下 man find ,看看还有哪些其他选项可用。
$ ls -1
test1
test2
test3
1)为了避免意外,让我们先来看一下命令。
$ for i in test*; do echo mv $i $i.ext; done
mv test1 test1.ext
mv test2 test2.ext
mv test3 test3.ext
如果这是我们想要的,就执行这些命令。
$ for i in test*; do mv $i $i.ext; done
$ ls -1
test1.ext
test2.ext
test3.ext
适应您的需求来调整路径。
2)可以使用sed和xargs。让我们先测试一下。
$ ls -1 test* | sed 'p;s/test/test_/' | xargs -n2 printf "%s %s\n"
test2 test_2
test1 test_1
test3 test_3
如果这是我们想要的,就执行这些命令。
$ ls -1 test* | sed 'p;s/test/test_/' | xargs -n2 mv
$ ls -1
test_1
test_2
test_3
文件名中的空格
如果文件名中包含空格,这些脚本将无法按预期工作。在Unix中,空格被用作分隔符。例如,对于以下文件:
$ ls -1
test 1
test 2
test 3
很明显,下面的命令无法按预期工作。
$ for i in test*; do echo mv $i $i.ext; done
mv test 1 test 1.ext
mv test 2 test 2.ext
mv test 3 test 3.ext
解决方案是将空格从分隔符列表中排除。
$ IFS="`printf '\n\t'`"
并将其添加到应处理带有空格的文件名的命令之前。下面的命令
$ IFS="`printf '\n\t'`"; for i in test*; do mv $i $i.ext; done
正常工作
$ ls -1
test 1.ext
test 2.ext
test 3.ext
下一个选项是引用论据。
for i in test*; do mv "$i" "$i.ext"; done
这样就可以使用丰富多样的Unix过滤器,避免对"find ... -exec ... {}"结构的限制。有关其他限制,请参阅下方的注释。
在macOS上的注意事项:
1) 引用自opengroup.org - 产品标准:命令和实用程序V4
引用如下:
1.4.21 sh
问题31:当调用shell时,环境变量IFS是否被忽略?
回答:是的
原因:规范允许sh命令在调用时忽略IFS环境变量的设置。该变量的设置已被用于破坏使用shell解释对system()和execvp()接口的调用的系统的安全性。
参考:技术标准,Shell和实用程序,第6版,第4章,实用程序,sh,环境变量,IFS。
2) 引用自developer.apple.com - Shell输入和输出
引用块:
您可以通过修改shell变量IFS(内部字段分隔符的缩写)来修改read命令的行为。默认行为是在空格、制表符或换行符处拆分输入。通过更改此变量,...
3) 引用自developer.apple.com - 基本控制语句 - 标准循环
引用块:
在下一个示例中,列表是*.JPG...
#!/bin/sh
for i in *.JPG ; do
mv "$i" "$(echo $i | sed 's/\.JPG$/.x/')"
mv "$(echo $i | sed 's/\.JPG$/.x/')" "$(echo $i | sed 's/\.JPG$/.jpg/')"
done
这些脚本如果文件名中有特殊字符可能无法正常工作。请先替换这些特殊字符。参见如何去除特殊字符。有很多文章介绍如何重命名带有空格和其他会引起问题的字符的文件,比如文件名中带有空格导致for循环、find命令出错。在*nix系统中,在处理文件之前,最好摆脱这些字符并将文件名转换为您喜欢的格式(例如重命名文件)。参见修复Unix/Linux/POSIX文件名。
test 1 的文件名以及类似的情况。如果当前目录中存在以 test 开头的文件名,它也不会按照您的期望执行。 - nohillside\0终止字符串的选项和工具,并小心设置和使用变量即可。请参考http://mywiki.wooledge.org/BashPitfalls和http://mywiki.wooledge.org/BashFAQ :-) - nohillsidefind的结果上使用for循环。使用find ... -exec(结合xargs和/或sh -c)是Unix中处理这类事情的标准方式。 - nohillside