2012-11-26 102 views
0

我對於bash腳本來說是個新手,所以可能是相當愚蠢的問題,但這裏就是這樣。 這個想法如下:在日誌中保存基本文件名爲的文件 - >移動文件 - >使用日誌移回原來的位置。Bash腳本mv並用日誌恢復到原始位置

basename $filename >> /directory/log 
mv $filename /directory 

到目前爲止好,但我對如何使用該日誌文件,以獲取文件回來很困惑。是基本名稱即使是正確的使用?我的想法是使用grep在日誌中查找文件名,但我該如何去獲得輸出在mv的末尾?

mv $filename ??? 

我在正確的軌道上嗎?搞砸了一些非常基本的東西?

+1

問題不清楚。請詳細說明。你可以像你所描述的那樣使用'basename'。 – mtk

+0

那麼,在這種情況下使用_grep_有效,如果是這樣,我怎麼得到該輸出與_mv_一起使用?如果沒有,那裏有什麼選擇? – user1732866

回答

0

讓我們文件httpd.conf作爲一個例子,它的位置是在目錄/etc/httpd/conf/

$ ls /etc/httpd/conf/httpd.conf 
/etc/httpd/conf/httpd.conf 

命令basename條路徑並且僅返回文件名(和擴展名)

$ basename /etc/httpd/conf/httpd.conf 
httpd.conf 

所以,當你這樣做:

basename $filename >> /directory/log 

你正在創建一個只包含文件名的日誌文件,您將無法使用/directory/log將文件移動回它原來的位置,因爲在用basename命令剝離該信息。

你會想要做這樣的事情:

echo $filename >> /directory/log 
mv $filename /directory 

所以,現在/directory是文件的新位置,並/directory/log包含文件的原始位置。

0

如果你需要從文件中得到一個字符串,並在某些命令中使用它,然後grep會工作

mv $filename `grep <your-grep-pattern> <you-logfile>` 

這將做相應的動作,因爲日誌文件包含了匹配正確的數據。

0

到這樣的事情?

#set a variable saving the filename but not path of a file. 
MY_FILENAME=$(basename $filename) 
echo $MY_FILENAME >> /directory/log 
mv $MY_FILENAME /diectroy/. 

# DO STUFF HERE 
# to your file here 

#Move the file to the PWD. 
mv /directory/${MY_FILENAME} . 
unset $MY_FILENAME 
     #unseting variable when you are done with them, while not always 
     #not always necessary, i think is a good practice. 

反之,如果你想將文件移動回orgianl位置而不是PWD的第二MV聲明是這樣的。

mv /directory/${MY_FILENAME} $filename 

而且如果由於某些範圍界定問題,你沒有thate局部變量可用,當你做回遷,真正需要從文件中讀取優爾應該做這樣的事情:

#set a variable saving the filename but not path of a file. 
MY_FILENAME=$(basename $filename) 
echo "MY_FILENAME = " $MY_FILENAME >> /directory/log 
# I'm tagging my var with some useful title so it is easier to grep for it later 
mv $MY_FILENAME /diectroy/. 

# DO STUFF HERE 
# to your file here 

#Ive somehow forgotten my local var and need to get it back. 
MY_FILENAME=$(cat /directory/log | grep "^MY_FILENAME = .*" | awk '{print $3}'); 
#inside the $() a cat the file to read it 
# grep on "^MY_FILENAME = .*" to get the line that starts with the header i gave my filename 
# and awk to give me the third token (I always use awk over cut out of preference, cut would work also. 
# This assumes you only write ONE filename to the log, 
# writing more makes things more complicated 

mv /directory/${MY_FILENAME} $filename 
unset $MY_FILENAME