我正在使用此脚本,但选项-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
答案 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 因此,您可以使用globbing和find
来测试当前文件是否可执行,而不是使用[[ -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
当前循环仅限于您的" $ dir /"中的内容,如果您想更深入地探索" $ dir / / / *& #34;你需要:
globstar
shell option; shopt
built-in
for
循环中更新您的glob以使用它:"$dir"/**
shopt -s globstar # enable/set
for f in "$dir"/**/*; do [[ -x $f ]] && mv "$f" /tmp; done
shopt -u globstar # disable/unset
Bash有语法糖,让你替换:
if [ $# -lt 1 ] ; then … fi
与
if (( $# < 1 )); then … fi
更多关于算术表达式阅读文章: 1. wooledge's wiki; 2. bash-hackers' wiki。