You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

脚本中处理含空格目录名的文件移动与归档问题求助

脚本中处理含空格目录名的文件移动与归档问题求助

大家好,我遇到了一个脚本处理含空格目录名的问题,想请教下解决方案:

问题背景

我需要创建一个目录,目录名用它要包含的文件的名称前缀,之后把这些文件移进去再归档成.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.21 12:23:01