![提示、循环命令](https://linux22.com/image/116094/%E6%8F%90%E7%A4%BA%E3%80%81%E5%BE%AA%E7%8E%AF%E5%91%BD%E4%BB%A4.png)
有没有通用的方法来执行 unix 命令并在文件列表上循环它。例如,假设我们想要将一个目录中的所有文件(但不是目录)移动到另一个目录,但在每个文件之前都会提示 y/n。显然,这可以通过脚本来完成,但是有没有一种命令方法不仅可以用于 mv,还可以用于任何类似的对文件执行操作(rm、cat、wc、grep 等) ?
答案1
是的,
find /path/to/source/dir -type f -maxdepth 1 -ok mv {} /path/to/target/dir \;
这里的命令find
将查找所有常规文件/path/to/source/dir
并提示用户确定以执行给定的操作,在本例中会将文件移动到/path/to/target/dir
.如果用户按下y
(和enter),将执行该操作。
将{}
依次替换为每个找到的文件的名称,并且为每个文件执行的命令以 结尾\;
。
如果替换-ok
为-exec
,则不会提示用户,并且会在全部文件。
-maxdepth 1
将文件搜索限制在最顶层目录 ( /path/to/source/dir
)。如果没有它,find
将递归到给定路径下的所有子目录。
-type f
将搜索限制为仅常规文件(即,不搜索目录、套接字、设备文件等)
答案2
一般来说,我会使用 shell 通配来生成您想要操作的文件列表,然后执行读取和测试以确定是否执行该操作。
对于(你的)例子:
for f in *
do
[ -f "$f" ] || continue
read -p "mv $f to /tmp? "
if [ $REPLY = "y" ]
then
echo "moving $f to /tmp"
# mv -- "$f" /tmp
else
echo "not doing anything with $f"
fi
done
根据您的 shell 设置,这可能会也可能不会拾取点文件(例如.bashrc
)。
你可以根据自己的喜好改变这一点——不要回应“不”的回应;允许“y”或“Y”或“yes”或“yabadabadoo”。