首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Bash脚本将子文件夹中的多个文件重命名为它们的文件夹名

Bash脚本将子文件夹中的多个文件重命名为它们的文件夹名
EN

Stack Overflow用户
提问于 2016-01-24 02:20:45
回答 2查看 1.3K关注 0票数 1

我有以下文件结构:

代码语言:javascript
复制
Applications/Snowflake/applications/Salford_100/wrongname_120.nui; wrongname_200_d.nui
Applications/Snowflake/applications/Salford_900/wrongname_120.nui; wrongname_200_d.nui
Applications/Snowflake/applications/Salford_122/wrongname_120.nui; wrongname_200_d.nui

我想将这些文件夹重命名为与它们所在目录相同的名称,但是末尾带有"_d“的文件应该保留其最后两个字符。文件模式总是"salford_xxx“,其中xxx总是3位数。因此,生成的文件将是:

代码语言:javascript
复制
Applications/Snowflake/applications/Salford_100/Salford_100.nui; Salford_100_d.nui
Applications/Snowflake/applications/Salford_900/Salford_900.nui; Salford_900_d.nui
Applications/Snowflake/applications/Salford_122/Salford_122.nui; Salford_122_d.nui

中的不同位置运行脚本。

代码语言:javascript
复制
Applications/Snowflake/Table-updater

我想这需要一个for循环和sed正则表达式,但是我可以接受任何建议。(谢谢@ghoti的建议)我已经尝试过了,它目前还没有解释带有"_d“的文件,我只是得到了一个正确重命名的文件。如果能提供一些帮助,我们将不胜感激。

代码语言:javascript
复制
cd /Applications/snowflake/table-updater/Testing/applications/salford_*

dcomp="$(basename "$(pwd)")"
for file in *; do
ext="${file##*.}"
mv -v "$file" "$dcomp.$ext"

done

我现在在@varun通知之后更新了脚本(谢谢),现在它还搜索父dir中的所有文件,其中包含了名字中的salford,而忽略了父名。请见下文

代码语言:javascript
复制
#!/bin/sh
#
#  RenameToDirName2.sh
#
set -e

cd /Applications/snowflake/table-updater/Testing/Applications/

find salford* -maxdepth 1 -type d \( ! -name . \) -exec sh -c '(cd {}  &&
    (
        dcomp="$(basename "$(pwd)")"
        for file in *;
        do ext="${file#*.}"
            zz=$(echo $file|grep _d)
        if [ -z $zz ]
        then
            mv -v "$file" "$dcomp.$ext"
        else
            mv -v "$file" "${dcomp}_d.$ext"
    fi
done
)
)' ';'

问题是,我刚刚意识到,在这些salford子目录中,还有其他扩展名不同的文件,我不想重命名。我尝试过添加一个else语句来规定*.Nui文件,调用我的$dcomp变量,如下所示

代码语言:javascript
复制
    else
    if file in $dcomp/*.nui
    then
     #continue...

但我会犯错。这在我的脚本中应该去哪里,我是否有这个循环的正确语法?你能帮上忙吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-01-25 06:19:08

@茄子,我修改了我的脚本,它将查看文件夹应用程序中的所有目录,并查找其中包含Salford的文件夹。所以你可以这样称呼我的剧本

./rename.sh /home/username/applications/雪花e/应用程序

代码语言:javascript
复制
#!/bin/bash
#    set -x
path=$1
dir_list=$(find $path/ -type d)
for index_dir in $dir_list
do
    aa=$(echo $index_dir|grep Salford)
    if [ ! -z $aa ]
    then
            files_list=$(find $index_dir/ -type f)
            for index in $files_list
            do
                    xx=$(basename $index)
                    z=$(echo $xx|grep '_d')
                    if [ -z $z ]
                    then
                            result=$(echo $index | sed 's/\/\(.*\)\/\(.*\)\/\(.*\)\(\..*$\)/\/\1\/\2\/\2\4/')
                            mv "$index" "$result"
                    else
                            result=$(echo $index | sed 's/\/\(.*\)\/\(.*\)\/\(.*\)_d\(\..*$\)/\/\1\/\2\/\2_d\4/')
                            mv "$index" "$result"
                    fi
            done
    fi
  done

对于sed,它使用sed的s命令,并将文件名替换为目录名,保持扩展名不变。

对于您的脚本,您需要使用grep命令来查找具有_d的文件,并且可以使用参数替换来使用_d和一个没有_d的文件更改mv。

代码语言:javascript
复制
  dcomp="$(basename "$(pwd)")"
  for file in *; do
  ext="${file##*.}"
  zz=$(echo $file|grep _d)
  if [ -z $zz ]
  then
  mv -v "$file" "$dcomp.$ext"
  else
  mv -v "$file" "${dcomp}_d.$ext"
  fi
  done
票数 1
EN

Stack Overflow用户

发布于 2016-01-24 04:05:39

你可以写:

代码语言:javascript
复制
(
    cd ../applications/ && \
    for name in Salford_[0-9][0-9][0-9] ; do
        mv "$name"/*_[0-9][0-9][0-9].nui "$name/$name.nui"
        mv "$name"/*_[0-9][0-9][0-9]_d.nui "$name/${name}_d.nui"
    done
)

(注意:(...)是一个子subshell,用于限制目录更改和name变量的范围。)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34971502

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档