我正在模仿rm行为,其function类似于回收站。 这是我的代码到目前为止:
#!/bin/bash # tests if bin does not exist and if true, create it binName=$HOME/deleted if [ ! -d $binName ] then mkdir $binName else echo "recycle bin exists" fi if [ $# -eq 0 ] ; then echo "No argument passed" elif [ -d $1 ] ; then echo "is dir" elif [ ! -e $1 ] ; then echo "does not exist" else mv $1 $binName fi
我很努力的是在移动的文件的末尾添加一个低于分数和inode的数字,以避免在bin目录中出现重复的文件错误。 我试图从这个链接使用大括号扩展,但它会导致错误。
试试这个ls
:
inode=$(ls -id "${1}" | cut -d " " -f 1) mv "$1" "${binName}/${1}_${inode}"
或与stat
:
inode=$(stat --printf %i "${1}") mv "$1" "${binName}/${1}_${inode}"
或者用GNU find
:
inode=$(find -maxdepth 1 -name "${1}" -printf "%i") mv "$1" "${binName}/${1}_${inode}"
在被链接的问题的接受答案中,大括号扩展用于避免重复原始文件名。 (它会出现一次作为源代码,一次作为目标名称的一部分)。对于您的情况,这将是毫无意义的,因为您已经在名称$1
的变量中有名称。
所以你可以
mv $1 $binName/${1}_$(${command that gives the inode of} $1)
例如@Cyrus 建议的
mv $1 "${binName}/${1}_"$(find . -maxdepth 1 -name "${1}" -printf "%i")
仍然可以使用括号扩展来避免重复“ $1
”之一,但这只会使命令更难阅读。
代替
if [ ! -d $binName ] then mkdir $binName fi
你可以简单地使用
mkdir -p $binName
这将使目录保持不变,如果它已经存在。 如果任何父目录也丢失,它也会根据需要创建它们。 但是,当然不能输出“回收站存在”,但我想你只是出于调试/演示的原因,无论如何。