私のコードには次の問題があります。
#!/bin/bash
#Removing Files into the Recycle Bin(Deleted Directory)
filemove=$1 #Saving the first argument as "filemove"
mkdir -p ~/deleted #Create the deleted directory if it doesn't exist
mv $filemove ~/deleted #Moves the file
次の形式に従うには、ごみ箱にファイルが必要ですfilename_inode
。
答え1
- ツールを使用して
stat
inode番号を取得します。 - 直接使用してください
mv
。 - ファイル名(!!)を引用します(例
"$filemove"
:never$filemove
)。 - 移動する前に、いくつかの安全チェックを追加してください。
[ ! -e "$target" ] && mv ...
set -euo pipefail
スクリプトの先頭に使用されるため、エラーが発生すると失敗します。for f in "$@"; do ... done
ループを使用すると、複数のファイルを引数として使用できます。- 繰り返しますが、ファイル名(!!)を引用してください。
- 既製のソリューションを使用する方が良いです。たとえば、次のようになります。
#!/bin/bash
# Removing Files into the Recycle Bin (Deleted Directory)
set -euo pipefail #make script exit on any error
mkdir -p "$HOME/deleted"
dest="$HOME/deleted/${1}_$(stat --format %i "$1")"
# check if file exists, and if not, do the move!
[ -e "$dest" ] && echo "Target exists, not moving: $1" || mv "$1" "$dest"
次のようなものを使用trash file1
する trash "file with spaces"
(trash
スクリプト名であると仮定すると...)
あるいは、一度に複数のファイルを削除することもできます。
#!/bin/bash
# Removing Files into the Recycle Bin (Deleted Directory)
set -euo pipefail #make script exit on any error
mkdir -p "$HOME/deleted"
for f in "$@"; do
dest="$HOME/deleted/${f}_$(stat --format %i "$f")"
# check if file exists, and if not, do the move!
[ -e "$dest" ] && echo "Target exists, skipped moving: $f" || mv "$f" "$dest"
done
次のようなものを使用してくださいtrash file1 file2 "file with spaces"