ファイルをコピーしてゴミ箱に移動するBashスクリプト(非破壊)

ファイルをコピーしてゴミ箱に移動するBashスクリプト(非破壊)

cpまたは好ましくはrsyncを使用してファイルをコピーし、ソースファイルをごみ箱に移動するbashスクリプトを作成しようとしています。問題が発生した場合は、ソースファイルを復元できるため、mvを使用したくありません。

このスクリプトは機能します。ターゲットフォルダをハードコードします。

for i in "$@"; do
    cp -a -R "$i" '/home/userxyz/Downloads/folder1'
    gio trash "$i"
done

ただし、ターゲットフォルダ変数を使用するこのスクリプトは機能しません。

read -p "Enter destination folder: " destination

for i in "$@"; do
    cp -a -R "$i" "$destination"
    gio trash "$i"
done

ターゲットとして「/home/userxyz/Downloads/folder1」と入力するとエラーが発生します。

cp: cannot create regular file "'/home/userxyz/Downloads/folder1'": No such file or directory

繰り返しますが、これはうまくいきます:

for i in "$@"; do
    rsync "$i" '/home/userxyz/Downloads/folder1'
    gio trash "$i"
done

しかし、これはうまくいきません。

read -p "Enter destination folder: " destination

for i in "$@"; do
    rsync "$i" "$destination"
    gio trash "$i"
done

間違い:

rsync: change_dir#3 "/home/userxyz//'/home/userxyz/Downloads" failed: No such file or directory (2)
rsync error: errors selecting input/output files, dirs (code 3) at main.c(720) [Receiver=3.1.3]

「/home/userxyz/Downloads/folder1」が存在することを確認しました。私は何が間違っていましたか?

ベストアンサー1

@berndbauschと@Freddyの有用な提案に感謝します!ターゲット名の一重引用符が問題であることがわかりました。一重引用符を削除し、不要なループを削除するようにスクリプトを修正しました。これでrsyncとcpで動作します。

read -p "Enter destination folder: " destination

dest="${destination%\'}" #remove the suffix ' (escaped with a backslash to prevent shell interpretation)
dest="${dest#\'}" #remove prefix ' (escaped with a backslash to prevent shell interpretation)

rsync -a -W "$@" $dest #or cp -a "$@" $dest
gio trash "$@"

おすすめ記事