在如何将当前文件夹中的所有文件移动到子文件夹中?,从一个文件夹中移动所有文件的解决方案是:
mv (!dontmovethis) /new/path/
尝试移动包含破折号的文件时,实现此目的的一种方法是:
mv -- '-dashie-file-' /new/path/
但正确的解决方案是什么?
- 如果
/new/path/
包含破折号:/new/-dash-path/
- 如果
dontmovethis
包含破折号:-dont-move-this
. - 两个都。
天真地尝试
mv -v -- (!'file-with-dash') '/new/path/with-dashes/'
产生神秘的信息(-v
只是为了mv
更详细):
bash: !'file: event not found
所以这可能是因为bash
正在捕捉!
角色。但是,当逃避 bash 时;
mv -v -- (\!'file-with-dash') '/new/path/with-dashes/'
mv -v -- (\\!'file-with-dash') '/new/path/with-dashes/'
mv -v -- (\\\\!'file-with-dash') '/new/path/with-dashes/'
mv -v -- (\!file-with-dash) /new/path/with-dashes/
(只是在混淆需要多少层转义的情况下尝试一些想法),所有这些都会产生:
bash: syntax error near unexpected token `('
这使我相信mv
在应用运算符时不会以相同的方式对完整文件名进行转义!
。最后,类似:
mv -v \(\!file-with-dash\) '/new/path/with-dashes'
mv -v \(\!'file-with-dash'\) '/new/path/with-dashes'
产生:
mv: cannot stat '(!file-with-dash)': No such file or directory
这意味着(
被转义太多:mv
正在寻找一个字面上命名为 的文件(!file-with-dash)
,而我希望它寻找file-with-dash
.
顺便说一句,该帖子的第二个答案很容易适应;
ls | grep -v dashing-file | xargs mv -t /new/dashing-folder
立即工作。这种方法有一个警告:如果有另一个名为dashing-file-with-evil-secrets
that 的文件,不是实际的dashing-file
,因此需要移动,会被grep
. 所以这不是一个完全正确的解决方案。
我只是想知道最佳答案(本文中的第一个代码块)是否也可以,因为它没有那个警告。还没有想出办法做到这一点。