我在这里读过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文件名仍然包含空格。这是我处理文件名包含空格的噩梦。
答案 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;