0

私は bash スクリプトに慣れていないので、おそらくかなりばかげた質問ですが、ここで説明します。アイデアは次のとおりです。ファイルのベース名をログに保存ます->ファイルを移動します->ログを使用して元の場所に戻ります。

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

ここまでは順調ですが、そのログ ファイルを使用してファイルを取得する方法についてはかなり混乱しています。basenameは使用するのに適していますか? 私が持っていたアイデアは、grepを使用してログ内のファイル名を見つけることでしたが、 mvの最後にその出力を取得するにはどうすればよいですか?

mv $filename ???

私は正しい軌道に乗っていますか?非常に基本的なことを台無しにしますか?

4

3 に答える 3

0

ファイルから文字列を取得し、それをコマンドで使用する必要がある場合は、機能しgrepます

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

ログファイルに一致の正しいデータが含まれている場合、これは適切なアクションを実行します。

于 2012-11-26T15:23:16.323 に答える
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. 

逆に、ファイルを PWD ではなく元の場所に戻したい場合、2 番目の mv ステートメントは次のようになります。

mv /directory/${MY_FILENAME} $filename

さらに、スコーピングの問題が原因で、元に戻すときにローカル変数を使用できず、ファイルからそれを読み取る必要がある場合は、次のようにする必要があります。

 #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 
于 2012-11-26T15:23:16.533 に答える
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の元の場所が含まれています。

于 2012-11-26T15:23:51.160 に答える