无法在shell脚本中使用带空格的文件名进行循环

时间:2017-09-21 06:27:18

标签: bash shell zip

我正在尝试使用空格来获取文件名 让他们进入for循环 压缩每个文件 拉链后,请使用以下内容删除原件:

for appdir in $(ls /home/location/$dirname); do

  for logFile in $(find /home/location/$dirname/$appdir -type f -mtime +10 \( ! -iname "*.zip" ! -iname "*.gz" \)); do
    echo $logFile

我想压缩的文件有空格:

/home/location/hdd1/domain/servername/EXT1/ET SOME To FILENAME/xml/sdlfkd.xml
/home/location/hdd1/domain/servername/EXT1/ET SOME To FILENAME2/xml/sd2fkd.xml

我知道带有空格的文件名可以制作成一个文件名,如下所示 -

find /location/$appdir -type f -mtime +10  -print0 | xargs -0 ls

实际的zip命令,它取自" for"条件稍后会取出每个文件,制作一个zip并删除原始文件。

我的zip命令出现以下错误:

[stdout: 4]                           zip warning: name not matched: ET
zip error: Nothing to do! (ET.zip)
[stdout: 4]           SOME
[stdout: 4]                           zip warning: name not matched: SOME
zip error: Nothing to do! (SOME.zip)

如何修改我每次都可以提供完整文件名的条件" for"循环,然后继续压缩每个文件并进一步? 任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

操作文件时始终使用双引号。

例如,参见下面的代码将创建一个名为b c的唯一文件:

will /home/will/a # touch "a b c"
will /home/will/a # ls -l
total 0
-rw-r--r--    1 root     system            0 Sep 21 08:47 a b c

但这将创建3个不同的文件,a,b和c

will /home/will/a # touch a b c
will /home/will/a # ls -l
total 0
-rw-r--r--    1 root     system            0 Sep 21 08:47 a
-rw-r--r--    1 root     system            0 Sep 21 08:47 b
-rw-r--r--    1 root     system            0 Sep 21 08:47 c

所以现在想象一下,我不会创建但是删除或更改这些文件,如果文件名不是预期的那么可能会更有害。

在你的情况下,我会尝试这个:

   for appdir in $(ls "/home/location/$dirname"); do

  for logFile in $(find "/home/location/$dirname/$appdir" -type f -mtime +10 \( ! -iname "*.zip" ! -iname "*.gz" \)); do
    echo "$logFile"