查找文件并 tar 文件名后缀或前导 space
Find files and tar them with trailing or leading space in their name
我有一个脚本,它试图用 tar
:
归档目录的内容
#!/bin/bash
find /root/files -type f -name "1*" -print0 | while read -d $'[=12=]' file
do
MYDIRNAME=$(dirname "${file}")
MYFILENAME=$(basename "${file}")
MYMODIFYDIR=$(echo "$MYDIRNAME" | sed 's/^\///' | sed 's/\//_/g' | sed 's/\ /_/g')
MYMODIFYFILENAME=$(echo "$MYFILENAME" | sed 's/\//_/g' | sed 's/\ /_/g')
GZIP=-9 tar -zcvf /root/"$MYMODIFYDIR"_"$MYMODIFYFILENAME".tar.gz "$file"
done
它不适用于名称中包含前导或尾随空格的文件。到达文件 /root/files/tetst\ test\ tgdjd/1\ 5765765\ 565765\
时发生错误( 注意 文件名中的尾随空格):
tar: /root/files/tetst test tgdjd/1 5765765 565765: Cannot stat: No such file or directory
tar: Exiting with failure status due to previous errors
tar 给出的错误从文件名中删除了尾随空格 。
你可以试试这个:
tar -zcvPf /root/"$MYMODIFYDIR"_"$MYMODIFYFILENAME".tar.gz "$file"
使用 -P 选项禁用此功能。
您忘记在 while 循环中重置 IFS
,因此前导和尾随空格被视为分隔符。使用这个:
find /root/files -type f -name "1*" -print0 | while IFS= read -d $'[=10=]' file
您还可以添加 -r
来读取文件名中是否可以有反斜杠。
有关 read
和 IFS
的更详尽解释,请参阅此处:
我有一个脚本,它试图用 tar
:
#!/bin/bash
find /root/files -type f -name "1*" -print0 | while read -d $'[=12=]' file
do
MYDIRNAME=$(dirname "${file}")
MYFILENAME=$(basename "${file}")
MYMODIFYDIR=$(echo "$MYDIRNAME" | sed 's/^\///' | sed 's/\//_/g' | sed 's/\ /_/g')
MYMODIFYFILENAME=$(echo "$MYFILENAME" | sed 's/\//_/g' | sed 's/\ /_/g')
GZIP=-9 tar -zcvf /root/"$MYMODIFYDIR"_"$MYMODIFYFILENAME".tar.gz "$file"
done
它不适用于名称中包含前导或尾随空格的文件。到达文件 /root/files/tetst\ test\ tgdjd/1\ 5765765\ 565765\
时发生错误( 注意 文件名中的尾随空格):
tar: /root/files/tetst test tgdjd/1 5765765 565765: Cannot stat: No such file or directory
tar: Exiting with failure status due to previous errors
tar 给出的错误从文件名中删除了尾随空格 。
你可以试试这个:
tar -zcvPf /root/"$MYMODIFYDIR"_"$MYMODIFYFILENAME".tar.gz "$file"
使用 -P 选项禁用此功能。
您忘记在 while 循环中重置 IFS
,因此前导和尾随空格被视为分隔符。使用这个:
find /root/files -type f -name "1*" -print0 | while IFS= read -d $'[=10=]' file
您还可以添加 -r
来读取文件名中是否可以有反斜杠。
有关 read
和 IFS
的更详尽解释,请参阅此处: