在外壳中处理文件名和空格

时间:2019-02-22 08:00:15

标签: linux bash shell unix

我在这里读过answer,但仍然出错。 在我的文件夹中,我只想处理*.gz文件,Windows 10.tar.gz的文件名中有空格。

假设文件夹包含:

Windows 10.tar.gz Windows7.tar.gz otherfile

这是我的shell脚本,我尝试了所有用“”引号,但仍然找不到我想要的东西。 crypt_import_xml.sh

#/bin/sh

rule_dir=/root/demo/rule
function crypt_import_xml()
{
    rule=$1
    # list the file in absoulte path
    for file in `ls ${rule}/*.gz`; do
        echo "${file}"
        #tar -xf *.gz

        #mv a b.xml to ab.xml

    done
}

crypt_import_xml ${rule_dir}

这就是我得到的:

root@localhost.localdomain:[/root/demo]./crypt_import_xml.sh 
/root/demo/rule/Windows
10.tar.gz
/root/demo/rule/Windows7.tar.gz

在tar xf * .gz文件之后,xml文件名仍然包含空格。这是我处理文件名包含空格的噩梦。

2 个答案:

答案 0 :(得分:3)

您不应该在ls循环中使用for

$ ls directory 
file.txt  'file with more spaces.txt'  'file with spaces.txt'

使用ls

$ for file in `ls ./directory`; do echo "$file"; done
file.txt
file
with
more
spaces.txt
file
with
spaces.txt

使用文件遍历:

$ for file in ./directory/*; do echo "$file"; done 
./directory/file.txt
./directory/file with more spaces.txt
./directory/file with spaces.txt

所以:

for file in "$rule"/*.gz; do
    echo "$file"
    #tar -xf *.gz

    #mv a b.xml to ab.xml
done

答案 1 :(得分:1)

您不需要在for循环中调用该ls命令,文件的泛化将在您的Shell中进行,而无需运行以下附加命令:

XXX-macbookpro:testDir XXX$ ls -ltra
total 0
drwx------+ 123 XXX  XXX  3936 Feb 22 17:15 ..
-rw-r--r--    1 XXX  XXX     0 Feb 22 17:15 abc 123
drwxr-xr-x    3 XXX  XXX    96 Feb 22 17:15 .
XXX-macbookpro:testDir XXX$ rule=.
XXX-macbookpro:testDir XXX$ for f in "${rule}"/*; do echo "$f"; done
./abc 123

根据您的情况,您可以将"${rule}"/*更改为:

"${rule}"/*.gz;