可以使用ls访问目录,但不能使用Bash访问目录


0

我有一群没有纪律的用户在我的服务器上使用邮件帐户。他们从不清空他们的垃圾或垃圾文件夹,文件数量上升到无穷大。

我正在创建一个Bash脚本,使用cron定期擦除这些文件。

我这样做了:

  1. 创建一个txt文件,其中包含我要删除的目录列表;
  2. 创建一个逐行读取的脚本,每个目录并擦除所有内容 curnew

txt文件示例:

~/mail/.Junk/cur
~/mail/.Junk/new
~/mail/.Trash/cur
~/mail/. Trash/new
~/mail/.administrative@example.com/.Junk/cur
~/mail/.administrative@example.com/.Junk/new
~/mail/.administrative@example.com/.Trash/cur
~/mail/.administrative@example.com/.Trash/new
~/mail/.finance@example.com/.Junk/cur
~/mail/. finance@example.com/.Junk/new
~/mail/. finance@example.com/.Trash/cur
~/mail/. finance@example.com/.Trash/new

我正处于脚本创建的第一阶段,我测试是否可以访问目录并列出其内容。

所以我有这个脚本:

#!/bin/bash 

while read line 
do 
ls $line
done < ~/directories.txt 

当我运行脚本时,我收到以下错误:

ls:无法访问〜/ mail / .administrative@example.com/.Junk/new/:没有   这样的文件或目录

对于所有目录,但如果我键入

ls ~/mail/.administrative@example.com/.Junk/new/

它工作正常。

为什么?


Chron在root下运行你的脚本,所以 ~ 指向不同的主目录(可能 /root )。使用完整路径,并确保root可以访问文件夹和内容。
Frank Thomas

您是否使用与手动执行“ls”时相同的用户运行脚本(或cron)?尽量回应 ~ 脚本中的路径,看你是否在正确的地方,也许你需要使用你家的绝对路径,而不是 ~
Flinth

Answers:


3

引用你的变量!

while read line 然后做 ls $line 不管用;你必须使用 ls "$line" 处理变量中的空格。通常,在使用变量时引用变量!

如果你不这样做,你在尝试时遇到了很大的问题 rm $line,如果那条线是

~/mail/. Trash/new

如果你这样做了 ls $line,它会尝试列出两个文件夹:

  • ~/mail
  • Trash/new

在最坏的情况下,如果你做了一个 rm -rf $line 你会删除 ~/mail 全然 !所以,使用 ls "$line" 在你的循环中。同样的 rm

事实上,逐行读取文件并正确处理空白的最强大的方法是 在这里解释

while IFS= read -r line; do
    ls "$line"
done < "$file"

-r 防止反斜杠被扩展,并且 IFS= 如果一行以空格开头或结尾,则会有所帮助,否则shell会修剪。

不要使用需要扩展的路径!

如果您的文本文件包含以后才会展开的路径,则路径将根据执行脚本的人员而改变。这里, ~ 将在执行时扩展到用户的主路径,因此如果您正在运行脚本 root,它将从 /root,而不是在创建文本文件时从用户的家中。

因此,请将完整路径存储在文件中。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.