我有一个 etckeeper 的 git clone,我正在尝试将名称中的所有文件和目录重命名etckeeper为usrkeeper. 例如,./foo-etckeeper-bar应该重命名为./foo-usrkeeper-bar.
查找相关文件很简单:
% find . -path '*etckeeper*' -print
Run Code Online (Sandbox Code Playgroud)
但是,我无法弄清楚如何实际进行重命名。我想结合xargs使用mv:
% find . -path '*etckeeper*' -print0 | xargs -0 -n 1 -J % bash -c mv % '$(echo' % \| sed \"s/etckeeper/usrkeeper/\" \)
Run Code Online (Sandbox Code Playgroud)
为了可读性,非转义的后半部分为:xargs -0 -n 1 -J % bash -c mv % $(echo % | sed "s/etckeeper/usrkeeper/" ). 其背后的想法是我们使用$()管道将文件名通过sed,用于进行替换。
这里的问题是bash -c要求执行的命令是单个字符串。之后,它开始将参数解释为位置参数。我可以引用整件事:
% find . -path …Run Code Online (Sandbox Code Playgroud) 所以我试图重命名目录中的所有文件,以便它们没有空格。我正在做一个 bash 脚本,我真的不知道该怎么做,我已经尝试了各种引号和转义,但我不确定什么组合可以工作。
#!/bin/bash
#change empty spaces in filenames to underlineos
lsarray="$(echo "$(pwd)""/*")"
for i in $lsarray
do
if [[ $i == *" "* ]]
then
line=$(echo $i | sed 's/ \+/\_/g')
j=$(echo $i | sed 's/ \+/\\ /g')
mv "$j" "$line"
echo "$i"
echo "$j"
echo "$line"
fi
done
Run Code Online (Sandbox Code Playgroud)
因为 mv 需要“特殊变量扩展”我在上面使用双引号。任何提示表示赞赏。
我有一组这样的图像:
01-12_13:20:12_1366x768.png 01-12_13:20:46_1366x768.png 01-12_13:21:01_1366x768.png 01-12_13:21:06_1366x768.png
01-12_13:20:40_1366x768.png 01-12_13:20:47_1366x768.png 01-12_13:21:02_1366x768.png 01-12_13:21:07_1366x768.png
01-12_13:20:42_1366x768.png 01-12_13:20:49_1366x768.png 01-12_13:21:03_1366x768.png 01-12_13:21:08_1366x768.png
01-12_13:20:44_1366x768.png 01-12_13:20:59_1366x768.png 01-12_13:21:04_1366x768.png 01-12_13:21:10_1366x768.png
01-12_13:20:45_1366x768.png 01-12_13:21:00_1366x768.png 01-12_13:21:05_1366x768.png
Run Code Online (Sandbox Code Playgroud)
我需要将每个替换:为_. 我怎样才能使用 bash 命令做到这一点?
(note : i love when everything is compact and one-lined)