我正在 Centos 7 中创建一个脚本,将一个目录中的最新文件移动到另一个目录。我从中复制的原始目录包含一个有效文件,但是当我尝试移动或复制该文件时,它会出错,提示该文件不存在。我知道该文件确实存在,正如我在下面证明的那样。为什么会失败以及我可以采取哪些措施来修复它?
如果我从 shell 中的脚本运行此行,则会$(
按预期将输出扩展为变量:
NEW=$(ls -Art /home/user/directory/ | tail -1)
我可以通过回显变量的值来向自己证明这一点,如下所示:
echo $NEW
file.tar.gz
然后我尝试将文件移动到不同的目录:
mv $NEW /usr/local/directory/
..这就是我收到错误的地方。请注意,错误消息明确命名了它找不到的文件:
mv:无法统计“file.tar.gz”:没有这样的文件或目录
shell 似乎告诉我它找不到该文件,然后命名它找不到的文件。
我尝试用括号替换反引号,但结果相同。我尝试将文件及其上面的目录的权限更改为我能想到的几乎所有排列,并将所有权更改为 user.user
我尝试以 root 和用户身份运行该命令,每次都得到相同的结果。我将不胜感激任何帮助解决此问题的尝试。
答案1
看来您不在文件所在的目录中。
你用
ls -Art /home/user/directory/
它仅返回文件名部分,而不返回目录部分。
你的移动命令应该是
mv "/home/user/directory/$NEW" /usr/local/directory/
答案2
或者 ;
NEW="/home/user/directory/"`ls -Art /home/user/directory/ | tail -1`
然后你的mv
命令照常进行。
mv "$NEW" /usr/local/directory/
答案3
如果您ls -Art /home/user/directory
单独尝试,您会注意到它仅输出没有目录路径部分的文件名。这意味着您的NEW
变量缺少/home/user/directory
文件路径名开头的位。
添加这个NEW
将使你的命令工作,假设“好的”文件名(没有换行符或其他空格,也没有任何文件名通配字符),并假设你很乐意接受任何输出的文件名tail
,即使它是目录的名称。
解决将最近修改的常规文件从一个目录移动到另一个目录的问题的更好方法是使用 shell zsh
:
mv /home/user/directory/*(.Dom[1]) /usr/local/directory
是(.Dom[1])
一个通配限定符,使前面的模式仅匹配常规文件 ( .
),使其可能匹配隐藏名称 ( D
,作用类似于dotglob
中的 shell 选项bash
),按修改时间戳对结果列表进行排序 ( om
),并从其中挑选第一个元素排序后的列表 ( [1]
)。
来自bash
或任何其他外壳:
zsh -c 'mv /home/user/directory/*(.Dom[1]) /usr/local/directory'