我有一个脚本用于自动化一个简单的过程,我将一个数字扫描到命令行中,从目录文件中 grep 出该数字,该文件为我提供了一个路径,然后将上述数字对应的 DVD 复制到该路径。 cp 命令一直失败。我看过其他帖子,其中 cp 不在脚本中工作,但它们似乎都与文件名周围的引号有关。我不认为这是我的问题。
我添加了一些评论,希望结果会更清楚:
\#!/bin/bash
\# accepts a single command line parameter: six-digit DVD number, ex. 987110
\# the empty echo lines are just whitespace for readability**
clear
file=/public/TAPES/batch1/Shipment_1_catalog.txt.dvd
echo
echo DVD number is $1
echo
echo catalogfile is $file
>\# this grep instruction greps $1 out of $file
>\# output from this is 'XXXXXX file-path-to-copy-dvd-contents-to'
>\# qwk puts the file-path... into $pth
pth=`grep $1 $file | awk ' { print $2 } '`
echo
echo destination path is $pth
echo
mount /dev/sr0 /media # appears to work
cp -p -r /media/\* $pth # this always fails - see error text below.
echo
umount /dev/sr0 && eject # this does work
除了复制命令之外,一切正常。它产生以下错误输出:
DVD 编号为 987110
catalogfile is /public/TAPES/batch1/Shipment_1_catalog.txt.dvd
destination path is > /proj/T_010/gdm/SAM/BRA/3D/Santos_ESP_3D_BDEP_2010/dvd/legacy/987110_Line_Section_Various_Vintages-Post_Stack_Migration_DVD_14_of_41
mount: block device /dev/sr0 is write-protected, mounting read-only
cp: cannot stat `/media/*': No such file or directory
该脚本的权限是 755。我已经尝试过“./cpy.sh”和“bash cpy.sh”,两次都得到相同的结果。
答案1
在 UNIX 系统上,通配符由 shell 处理。*
以下命令中的转义符将传递给看起来名为但可能不存在的cp
文件。/media/*
cp -p -r /media/\* $pth
相比之下,在 Windows 中,*
不是由命令处理器而是由copy
命令处理。
仅允许 root 更改文件所有权。否则,系统的任何用户都可以获取任何其他用户的文件。cp: failed to preserve ownership ...
预计如此。