无法移动可执行文件

时间:2014-08-28 12:06:48

标签: bash

我正在使用此脚本,但选项-x不起作用,它应该只移动可执行文件。

这是我收到的错误:

$ sh wizlast.sh u555 -x
mv: target ‘./u555/ud’ is not a directory

它定位到正确的文件( ud ),但不会移动它。我尝试了不同类型的组合。

 #!/bin/bash

 dir=$1


if [ $# -lt 1 ] ; then
    echo "ERROR: no argument"
    exit 1  # pas 0
else
    case $2 in                                                                                                                                                                                               
    -d) 
     mv $dir/* /tmp/*
     echo 'moving with -d'        
     ;;
    -x)
     find -executable -type f | xargs mv -t "$dir"/* /tmp
     echo 'moving executables'
     ;;
     *)
     mv $dir/* /tmp/
     echo 'no flag passed so moving all'
     echo "mv $dir/* /tmp/"
     ;;
esac
fi

4 个答案:

答案 0 :(得分:2)

man mv显示:

-t, --target-directory=DIRECTORY

您不能将$dir/*用作目标目录,因为shell会扩展它并将列表中的第一个文件视为目标(因此出错)。

答案 1 :(得分:1)

使用此格式

例如,将文件移至$dir

find -executable -type f | xargs -I{} mv {} "$dir"/

I{}告诉xargs用管道中的字符串替换和出现{},所以在mv之后,在目录"$dir"/之前替换每个字符串并且命令有效像平常一样。

你的工作原因是,查找中的字符串最后被读取,因此被视为要移入的目录。

答案 2 :(得分:0)

不要在mv命令的目标部分使用通配符,而不是

mv $dir/* /tmp/*

DO

mv $dir/* /tmp/

答案 3 :(得分:0)

当您与Bash合作时,您应该利用它的工具和语法改进。

解决方案for循环和 globbing

因此,您可以使用globbingfind来测试当前文件是否可执行,而不是使用[[ -x ]]

for f in "$dir"/*; do
  if [[ -x $f ]]; then
    mv "$f" /tmp
  fi
done

它使用-x中的条件表达式 [[ … ]]

  

-x file        如果文件存在且可执行,则为真

作为单线

您可以将其重写为:for f in "$dir"/*; do [[ -x $f ]] && mv "$f" /tmp; done

更深入的搜索(d> 1)

当前循环仅限于您的" $ dir /"中的内容,如果您想更深入地探索" $ dir / / / *& #34;你需要:

  1. 使用globstar shell option;
  2. 切换shopt built-in
  3. for循环中更新您的glob以使用它:"$dir"/**
  4. shopt -s globstar # enable/set
    for f in "$dir"/**/*; do [[ -x $f ]] && mv "$f" /tmp; done
    shopt -u globstar # disable/unset
    

    Arithmethic context

    Bash有语法糖,让你替换:

    if [ $# -lt 1 ] ; then … fi
    

    if (( $# < 1 )); then … fi
    

    更多关于算术表达式阅读文章: 1. wooledge's wiki; 2. bash-hackers' wiki