将文件移动到另一个目录,同时添加下划线和inode编号

我正在模仿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 

这将使目录保持不变,如果它已经存在。 如果任何父目录也丢失,它也会根据需要创建它们。 但是,当然不能输出“回收站存在”,但我想你只是出于调试/演示的原因,无论如何。