脚本中处理含空格目录名的文件移动与归档问题求助
脚本中处理含空格目录名的文件移动与归档问题求助
大家好,我遇到了一个脚本处理含空格目录名的问题,想请教下解决方案:
问题背景
我需要创建一个目录,目录名用它要包含的文件的名称前缀,之后把这些文件移进去再归档成.tar.xz。手动执行命令完全没问题,但一用到脚本里的变量就各种报错,尤其是目录名带空格的时候,不管是移动文件还是归档都卡壳了。
手动执行正常的流程
先看手动操作的成功例子:
❯ ll drwxr-xr-x 1 alex alex 84 sep 29 17:13 . drwxr-xr-x 1 alex alex 164 sep 29 17:06 .. drwxr-xr-x 1 alex alex 0 sep 29 16:57 'FILE 123 EN' -rw-r--r-- 1 alex alex 607270464 sep 29 16:48 'FILE 123 EN.iso' -rw-r--r-- 1 alex alex 486 sep 29 16:48 'FILE 123 EN.niso' ❯ mv FILE\ 123\ EN.* FILE\ 123\ EN/ ❯ ll drwxr-xr-x 1 alex alex 22 sep 29 17:16 . drwxr-xr-x 1 alex alex 164 sep 29 17:06 .. drwxr-xr-x 1 alex alex 62 sep 29 17:16 'FILE 123 EN' ❯ tar -cf - 'FILE 123 EN' | xz -vT1 -6 -c - > 'FILE 123 EN.tar.xz' && rm -r 'FILE 123 EN' ❯ ll drwxr-xr-x 1 alex alex 36 sep 29 17:21 . drwxr-xr-x 1 alex alex 164 sep 29 17:06 .. -rw-r--r-- 1 alex alex 416776676 sep 29 17:21 'FILE 123 EN.tar.xz'
用变量执行时的失败尝试
但换成脚本里的变量后,各种操作都失败了,下面是我试的几种方法:
首先是创建目录没问题,但移动文件报错:
❯ ll drwxr-xr-x 1 alex alex 62 sep 29 17:24 . drwxr-xr-x 1 alex alex 164 sep 29 17:06 .. -rw-r--r-- 1 alex alex 607270464 sep 29 16:48 'FILE 123 EN.iso' -rw-r--r-- 1 alex alex 486 sep 29 16:48 'FILE 123 EN.niso' ❯ VAR1='FILE 123 EN' ❯ mkdir "$VAR1" ❯ ll drwxr-xr-x 1 alex alex 84 sep 29 17:25 . drwxr-xr-x 1 alex alex 164 sep 29 17:06 .. drwxr-xr-x 1 alex alex 0 sep 29 17:25 'FILE 123 EN' -rw-r--r-- 1 alex alex 607270464 sep 29 16:48 'FILE 123 EN.iso' -rw-r--r-- 1 alex alex 486 sep 29 16:48 'FILE 123 EN.niso' ❯ mv "$VAR1.*" "$VAR1/" mv: failed to execute stat for 'FILE 123 EN.*': There is no such file or directory
然后试了find+print0+xargs,结果也不对:
❯ find . -type f -iname "$VAR1.*" -print0 | xargs -IF -0 mv F "$VAR1/" mv: unable to move './FILE 123 EN.iso' to './FILE 123 EN.isoILE 123 EN/': This is not a directory mv: unable to move './FILE 123 EN.niso' to './FILE 123 EN.nisoILE 123 EN/': This is not a directory
尝试转义空格也没用:
❯ VAR2=$(echo "$VAR1"|sed 's#\s#\\ #g') ❯ echo $VAR2 FILE\ 123\ EN ❯ mv $VAR2.* "$VAR1/" mv: failed stat for 'FILE\': No such file or directory mv: failed to execute stat for '123\': No such file or directory mv: failed to execute stat for 'EN.*': No such file or directory ❯ mv "$VAR2.*" "$VAR1/" mv: failed to execute stat for 'FILE\ 123\ EN.*': There is no such file or directory
用find的-exec也没写对:
❯ find . -iname "$VAR1*" -type f -exec mv {} "$VAR1/" find: missing argument from "-exec"
我的诉求
目前还没找到简单的解决办法,虽然可以考虑把文件名写到while循环里读取再操作,或者把空格换成下划线,但我不想重命名文件,希望能找到最简单的方式解决这个问题。
备注:内容来源于stack exchange,提问作者alex2020
相关产品推荐
相关产品推荐

