for循环在目录名前添加目录名

麦克斯布雷

我知道这个话题已经被讨论过了(请在这里以及其他地方),但是请您放纵一下,因为我正试图通过bash脚本艺术找到自己的方式。

我需要解决以下问题

鉴于我有:

目录1

  • 文件1
  • 文件2
  • 等等...

目录2

  • 文件1
  • 文件2
  • 等等...

我想重命名文件,以便

目录1

  • dir1_file 1
  • dir1_file 2
  • dir1_,依此类推...

目录2

  • dir2_file1
  • dir2_file2
  • dir2_,依此类推...

到目前为止,我已经设法制定出以下“探索性” bash脚本

for d in `ls -d */`
 do
   #echo "$d"
   pre="${d:0:-1}"
   #echo "$pre"
   #cd "${d}"
   pushd "${d}"
    for f in *.jp2
     do
        #echo "${f}"
        echo "${pre}_${f}"
     done
   #cd - 
   #popd    
 done

除了错误消息外,它似乎工作正常(相当)

line 9: pushd: dir2/: No such file or directory

其中dir2是被for循环扫过的最后一个dir的名称...

有什么帮助吗?我想念的是什么?

库萨兰达

而不是尝试cd来回进入目录(popd并且pushd主要是用于交互式使用):

#!/bin/sh

for name in */*; do
    [ ! -f "$name" ] && continue

    dir="$( basename "$( dirname "$name" )" )"
    newname="$dir/${dir}_${name##*/}"

    if [ ! -e "$newname" ]; then
        echo mv "$name" "$newname"
    fi
done

这将遍历当前目录中所有目录中的所有名称。它将跳过非文件,并将目录基本名称(没有路径的目录名称)提取到中dir然后,它$newname使用$dir和中的路径名的basename部分$name${name##*/}可以用替换$( basename "$name" )为文件构造一个新的文件名

如果尚未使用新名称,则文件将被重命名。

echo确认应该执行正确的操作后,删除即可实际重命名文件。


要在另一个目录中执行一组操作然后返回,请使用

( cd dir
  action
  action 
  action )

更改后的目录不会影响之外的环境( ... )


另请参阅:为什么*不*解析`ls`?

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章