我知道-exec可以+选择模仿xargs. 是否存在您更喜欢一种形式而不是另一种形式的情况?
我个人倾向于更喜欢第一种形式,如果只是为了避免使用管道。我find相信开发人员一定已经做了适当的优化。我对么?
有时我需要重命名一个目录中的所有文件(重命名约定在后面),其中文件名总是以“filenamename.extension”的形式(扩展名总是存在和变化)。该名称可能包含来自 [:graph:] 类的空格和字符。我的第一个问题是它应该在 *NIX 系统(尤其是 Linux、BSD、后来的其他系统,比如 AIX)之间绝对可移植。我的第二个问题是 [:graph:] 类。文件名可以是:
cat.txt
dog_and_cat.txt
Where is the cat?.png
my.cat.is.cute.txt.js.html
;;; ;;; ;;;.......321
áéú? _[a lot of whitespaces]_ óü^^^^^ö.jpg
Run Code Online (Sandbox Code Playgroud)
很容易看到,那些很难处理并放入 for 循环中。例如,
for i in *; do something; done
Run Code Online (Sandbox Code Playgroud)
并不总是喜欢空格和奇怪的字符,尤其是在不同的操作系统中。
重命名约定是将所有文件重命名为$FOOBAR.$EXTENSIONwhere$FOOBAR是某种散列形式,例如 md5sum。所以在 for 循环中我有一条线,就像
mv $FILE $(md5sum $FILE | sed 's/\ \ .\+//');
Run Code Online (Sandbox Code Playgroud)
它会将文件移动到自身的 md5sum,但扩展名消失了。我想保留扩展名,这些扩展名几乎总是在.[a-zA-Z0-9]{1,3}表单中。有时.tar.gz也需要保留类似的扩展(当然我可以将它们添加到变量中,例如MYEXTENSIONS='tar.gz tar.bz2 foo.bar')。
我的直觉告诉我,这个问题可以通过参数化的默认 UNIX/shell 命令解决,但现在对我来说非常困难。我相信我会从答案中学到很多东西。我知道我说的是神奇的词portability,但是如果我必须指定语言,则首选 bash 中的解决方案。
我试图将所有扩展名为“XLS;1”的文件重命名为“XLS”,但它不起作用。
我在 windows xp 中的 cygwin 中尝试了以下操作,但它们不起作用:
mv *.XLS;1 *.XLS
mv *.XLS\;1 *.XLS
mv "*.XLS;1" *.XLS
Run Code Online (Sandbox Code Playgroud) 我正在使用 Fedora 24。
我尝试了很多不同的方法来做到这一点。我已经在 Windows VM 下尝试过,将有问题的文件夹作为共享文件夹。
我试过使用“重命名”命令。
我试过使用“mv”命令。
我试过在“文件”中重命名它们。
我尝试将文件名设置为带有 inode 的变量,然后重命名。(失去了来源)
26477098 'File | With Pipe.png'
xyz=`ls -i|grep 26477098|sed 's/26477098 //'`
mv "$xyz" File\ --\ With\ Pipe.png
mv: cannot stat 'File | With Pipe.png': No such file or directory
Run Code Online (Sandbox Code Playgroud)
无论我尝试以何种方式执行此操作,我都不断收到“没有这样的文件或目录”错误。
我也尝试过使用它们的 inode 号重命名它们(“mv”文件的 inode 号名称为乱码?)
26477098 'File | With Pipe.png'
[user@computer Pictures]$ find . -inum 26477098 -exec mv {} File\ --\ With\ Pipe.png \;
mv: cannot move './File | With Pipe.png' to 'File -- With Pipe.png': …Run Code Online (Sandbox Code Playgroud)