Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash脚本mv并使用日志恢复到原始位置_Bash - Fatal编程技术网

Bash脚本mv并使用日志恢复到原始位置

Bash脚本mv并使用日志恢复到原始位置,bash,Bash,我对bash脚本还很陌生,所以这可能是一个很愚蠢的问题,但现在就来了。 其思想如下:将文件的basename保存在日志-->移动文件-->使用日志移回原始位置 basename $filename >> /directory/log mv $filename /directory 到目前为止还不错,但我对如何使用该日志文件取回该文件感到非常困惑。basename是正确的使用方法吗?我的想法是使用grep在日志中查找文件名,但如何在mv的末尾获得输出呢 我走对了吗?把一些很基本的东西

我对bash脚本还很陌生,所以这可能是一个很愚蠢的问题,但现在就来了。 其思想如下:将文件的basename保存在日志-->移动文件-->使用日志移回原始位置

basename $filename >> /directory/log
mv $filename /directory
到目前为止还不错,但我对如何使用该日志文件取回该文件感到非常困惑。basename是正确的使用方法吗?我的想法是使用grep在日志中查找文件名,但如何在mv的末尾获得输出呢


我走对了吗?把一些很基本的东西搞砸了

如果您需要从文件中获取字符串并在某个命令中使用它,那么
grep
将起作用

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

这将执行适当的操作,因为日志文件包含匹配的正确数据。

是否要执行类似的操作

#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,则第二条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 

让我们以文件
httpd.conf
为例,它的位置在目录
/etc/httpd/conf/

$ ls /etc/httpd/conf/httpd.conf
/etc/httpd/conf/httpd.conf
命令
basename
去除文件路径,只返回文件名(和扩展名)

所以当你这样做的时候:

basename $filename >> /directory/log
您正在创建一个只包含文件名的日志文件,您将无法使用
/directory/log
将文件移回其原始位置,因为您使用
basename
命令删除了该信息

您可能希望执行以下操作:

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

因此现在
/directory
是文件的新位置,
/directory/log
包含文件的原始位置

问题不清楚。请详细说明。您可以使用您描述的
basename
。那么,在这种情况下使用grep有效吗?如果有效,如何使输出与mv一起工作?如果没有,有什么选择?
basename $filename >> /directory/log
echo $filename >> /directory/log
mv $filename /directory