Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 用于在某些目录末尾添加点的脚本_Bash_Rename - Fatal编程技术网

Bash 用于在某些目录末尾添加点的脚本

Bash 用于在某些目录末尾添加点的脚本,bash,rename,Bash,Rename,假设我有一个Directoriy whis结构: Divulgation ├── Biology │   └── Dawkins, C Richard │   └── Books ├── Chemistry │   └── Gray, Theodore W │   └── Books └── Physics ├── Hawking, Stephen W │   └── Books └── Sagan, Carl E └── Books 我

假设我有一个Directoriy whis结构:

Divulgation
├── Biology
│   └── Dawkins, C Richard
│       └── Books
├── Chemistry
│   └── Gray, Theodore W
│       └── Books
└── Physics
    ├── Hawking, Stephen W
    │   └── Books
    └── Sagan, Carl E
        └── Books
我想在首字母的末尾加上点,像这样:

Divulgation
├── Biology
│   └── Dawkins, C. Richard
│       └── Books
├── Chemistry
│   └── Gray, Theodore W.
│       └── Books
└── Physics
    ├── Hawking, Stephen W.
    │   └── Books
    └── Sagan, Carl E.
        └── Books
shopt -s extglob  
shopt -s globstar 
for d in @(Divulgation)/**/*./    
do echo "mv \"$d\" \"${d%./}/\" " 
         mv "$d" "${d%./}/" 
done
要删除它们,可以如下所示:

Divulgation
├── Biology
│   └── Dawkins, C. Richard
│       └── Books
├── Chemistry
│   └── Gray, Theodore W.
│       └── Books
└── Physics
    ├── Hawking, Stephen W.
    │   └── Books
    └── Sagan, Carl E.
        └── Books
shopt -s extglob  
shopt -s globstar 
for d in @(Divulgation)/**/*./    
do echo "mv \"$d\" \"${d%./}/\" " 
         mv "$d" "${d%./}/" 
done

但是,再加上这些,我不知道。。你能给我一些建议吗?谢谢

BASH\u重赛
是你的朋友:

这里有一个解决方案,用于只有一个中间首字母的情况。如果要捕获所有这些内容,请在循环中重复此操作:

if [[ $d =~ (.*\ [A-Z])($|\ .*) ]]
then
  new_name="${BASH_REMATCH[1]}.${BASH_REMATCH[2]}"
fi    

在regexp匹配之后,bash用regexp的捕获组填充数组bash\u REMATCH。第一组捕获所有内容,直到一个空格后跟一个大写字母,第二组捕获其余内容,并确保字母后面也有一个空格,或者是最后一个字母。换言之:确保它确实是一个孤立的字母。

如果有多个首字母怎么办?它们之间有空格吗?(
White,TH
White,TH
)好的观点,让我们假设。。嗯。。我也喜欢圆点。。但是当你在windows上打开硬盘时。。它以一个点结束。。嗯,无法打开该文件夹。。这个问题归咎于微软。。如果你有
sed
,你可以这样做:
dest=$(echo“$d”| sed”:a;s/\(.*)\([a-Z]\)/\1\2./;ta');mv“$d”“$dest”
。请注意,您应该从目的地移除传送带
/
,否则您的
mv
将失败(
mv a b/
尝试将
a
移动到
b
内部,给出
b/a
而不是
b
)非西方单字母名称如何?(我想你还是可以加上点,也可以叫它缩写,哈哈)有单字母的名字吗?我不知道