提示、循环命令

提示、循环命令

有没有通用的方法来执行 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”。

相关内容