我已經設法湊齊下面的腳本,將文件從一個Samba共享移動到另一個。它似乎適用於所有合法的Windows文件名,除非文件名中有美元字符($)。典型的文件名失敗是:〜$ file.doc
任何幫助,將不勝感激。
#!/bin/bash
# Script to move old files from public to quarantine
srcbase=/net/public
destbase=/net/quarantine
logfile=$srcbase/moved.log
date > $logfile 2>1&
find $srcbase -noleaf -atime +30 -print0 | while IFS="" read -r -d "" file ; do
if [ -f "$file" ]; then
relname="${file#*$srcbase}"
destname="$destbase$relname"
destdir="$(dirname "$destname")"
if [ ! -d "$destdir" ]; then
cmd1="mkdir -p \""$destdir"\""
eval "$cmd1" >> $logfile 2>&1
fi
cmd="mv --backup=t -v \""$file"\" \""$destname"\""
eval "$cmd" >> $logfile 2>&1
if [ -e "$destname" ]; then
cmd2="touch -a \""$destname"\""
eval "$cmd2" >> $logfile 2>&1
fi
fi
done
date >> $logfile 2>1&
echo Deleting empty directories from "$srcbase" >> $logfile 2>&1
find "$srcbase" -type d -empty -delete >> $logfile 2>&1
你確定$ in的文件沒有被鎖定嗎?通常情況下,名稱中包含$的臨時文件,並且由於已被另一個進程打開,通常它們是不可讀的。 – NibblyPig 2010-10-29 08:46:26
你爲什麼把你的命令放在變量中?例如,直接執行'mv --backup = t -v「$ file」「$ destname」>> $ logfile 2>&1'。這也可以避免你必須做所有那些尷尬的額外引用和轉義。 – 2010-10-29 15:55:27