AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / ubuntu / 问题 / 1223864
Accepted
Vidal
Vidal
Asked: 2020-04-04 11:20:24 +0800 CST2020-04-04 11:20:24 +0800 CST 2020-04-04 11:20:24 +0800 CST

使用包含的文件名替换文件夹名称

  • 772

我有一千个左右具有随机名称的文件夹。每个文件夹至少有一个扩展名为 avi、mkv、srt 或 mp4 的文件。
我打算用其中包含的第一个文件名(不带扩展名)替换随机生成的文件夹名称。顺便说一下文件名使用包含() - 和其他奇怪的字符。在我看来,脚本应该:

  1. 进入文件夹
  2. 获取不带扩展名的名字
  3. 走出文件夹
  4. 使用新名称重命名文件夹
  5. 递归遍历文件夹,因为它可能包含其他子文件夹

不过,第 5 步可能会被覆盖。
由于我是 bash 编程的书呆子,因此我很感激。任何人都可以帮忙吗?

directory batch-rename rename
  • 3 3 个回答
  • 694 Views

3 个回答

  • Voted
  1. Best Answer
    steeldriver
    2020-04-05T05:27:55+08:002020-04-05T05:27:55+08:00

    给定

    $ tree
    .
    ├── eYRlzR8Ibk
    │   ├── Awnluslskl
    │   │   └── ö, û, accnts.avi
    │   ├── baz
    │   └── xyz.mp4
    └── wHKEWxFgIt
        └── foo bar.srt
    
    3 directories, 4 files
    

    然后

    $ find . -mindepth 1 -depth -type d -execdir sh -c '
      for d; do
        set -- "$d"/*.*
        [ -e "$1" ] || continue
        f="${1##*/}"
        mv -n -- "$d" "${f%.*}"
      done
    ' sh {} +
    

    导致

    $ tree
    .
    ├── foo bar
    │   └── foo bar.srt
    └── xyz
        ├── baz
        ├── ö, û, accnts
        │   └── ö, û, accnts.avi
        └── xyz.mp4
    
    3 directories, 4 files
    
    • 2
  2. Gryu
    2020-04-04T17:34:02+08:002020-04-04T17:34:02+08:00

    脚本 在您的文本编辑器中复制/粘贴脚本用您的目录名称
    替换变量,该目录名称包含所有带有文件的目录 在 没有第一次尝试的情况下尝试看看会发生什么。 编辑后,您可以从文本编辑器中复制它并将其粘贴到终端窗口中。~/test/testfolders3sourcedir
    mv $oldname $newname

    sourcedir=~/test/testfolders3
    cd $sourcedir
    files=$(find . -type f)
    for f in $files
      do
        echo -e "0:Not modified file name:\t $f"
        bname=$(basename $f)                             # Get file's name without path to it
        filewe=$(echo $bname | sed 's/\.[^.]*$//')       # Get file's name without extension
        echo -e "1:Filename without extension:\t $filewe"
        dir=$(dirname $f)                                # Get directory name where file is located
        echo -e "2:Parent file's directory:\t $dir"
        parfold=$(echo $(dirname $dir) | sed 's/.\///')  # Get file's parent directory's parent directory name with stripped `./` preffix
        echo -e "3:Parent-parent stripped dir:\t $parfold"
        olddir=$(echo $dir | sed 's@.*/@@')              # Get file's parent directory name without path to it (everything before the last `/` slash is stripped)
        oldname=$sourcedir/$parfold/$olddir              # Get current file's parent directory name with full path
        echo -e "4:Old folder name:\t\t $oldname"; 
        newname=$sourcedir/$parfold/$filewe              # Set new file's parrent directory name with full path
        echo -e "5:New folder name:\t\t $newname"
        mv $oldname $newname                             # Renames folders
      done
    find $sourcedir -type f                              # Shows result
    

    抱歉,如果它没有完全优化。我不是程序员。这只是我发现编写它的不同答案的汇编。花了很多时间,因为我不经常这样做。

    它现在不检查目录是否存在。因此,通过第一个移动文件的名称重命名一次,它只会抛出如下消息:

    mv: cannot stat '/home/user/test/testfolders3/folders/lkjskd': No such file or directory
    

    第一个移动的文件并不意味着按字母顺序排列的第一个。

    下面是find $sourcedir -type f命令执行的结果:

    /home/user/test/testfolders3/folders3/file3/file3.mp4
    /home/user/test/testfolders3/folders3/file1/file1.avi
    /home/user/test/testfolders3/folders3/file2/file2.mkv
    /home/user/test/testfolders3/folders3/folders/file3/file3.mp4
    /home/user/test/testfolders3/folders3/folders/file1/file1.avi
    /home/user/test/testfolders3/folders3/folders/file2/file2.mkv
    /home/user/test/testfolders3/folders2/soft/soft.ware
    /home/user/test/testfolders3/folders2/soft/file1.avi
    /home/user/test/testfolders3/folders2/inter/inter.pol
    /home/user/test/testfolders3/folders2/inter/file3.mp4
    /home/user/test/testfolders3/folders2/file2/file2.mkv
    /home/user/test/testfolders3/folders2/file2/ser.seg
    /home/user/test/testfolders3/folders2/folders/file3/file3.mp4
    /home/user/test/testfolders3/folders2/folders/file1/file1.avi
    /home/user/test/testfolders3/folders2/folders/file2/file2.mkv
    /home/user/test/testfolders3/folders/kata/kata.ptx
    /home/user/test/testfolders3/folders/kata/file1.avi
    /home/user/test/testfolders3/folders/sinaps/sinaps.rtf
    /home/user/test/testfolders3/folders/sinaps/file3.mp4
    /home/user/test/testfolders3/folders/file2/file2.mkv
    /home/user/test/testfolders3/folders/file2/tema.txt
    /home/user/test/testfolders3/folders/file2/fan.in
    

    以前的文件夹名称:

    /home/user/test/testfolders3/folders3/kjakd/file2.mkv
    /home/user/test/testfolders3/folders3/jafklsjdkl/file1.avi
    /home/user/test/testfolders3/folders3/folders/kjakd/file2.mkv
    /home/user/test/testfolders3/folders3/folders/jafklsjdkl/file1.avi
    /home/user/test/testfolders3/folders3/folders/lkjskd/file3.mp4
    /home/user/test/testfolders3/folders3/lkjskd/file3.mp4
    /home/user/test/testfolders3/folders2/kjakd/file2.mkv
    /home/user/test/testfolders3/folders2/kjakd/ser.seg
    /home/user/test/testfolders3/folders2/jafklsjdkl/soft.ware
    /home/user/test/testfolders3/folders2/jafklsjdkl/file1.avi
    /home/user/test/testfolders3/folders2/folders/kjakd/file2.mkv
    /home/user/test/testfolders3/folders2/folders/jafklsjdkl/file1.avi
    /home/user/test/testfolders3/folders2/folders/lkjskd/file3.mp4
    /home/user/test/testfolders3/folders2/lkjskd/inter.pol
    /home/user/test/testfolders3/folders2/lkjskd/file3.mp4
    /home/user/test/testfolders3/folders/kjakd/file2.mkv
    /home/user/test/testfolders3/folders/kjakd/tema.txt
    /home/user/test/testfolders3/folders/kjakd/fan.in
    /home/user/test/testfolders3/folders/jafklsjdkl/kata.ptx
    /home/user/test/testfolders3/folders/jafklsjdkl/file1.avi
    /home/user/test/testfolders3/folders/lkjskd/sinaps.rtf
    /home/user/test/testfolders3/folders/lkjskd/file3.mp4
    
    • 0
  3. Vidal
    2020-04-06T03:36:32+08:002020-04-06T03:36:32+08:00

    Steelworker 提出的解决方案(见上文)完美、快速、流畅。一个非常干净和简单的代码。你们真是不可思议。感谢您的时间和奉献精神。此致。

    • 0

相关问题

  • 如何通过键盘在 Nautilus 树视图中自动展开所有子目录级别?

  • VirtualBox:Ubuntu 主机和 Ubuntu 来宾。我在来宾中的共享文件夹在哪里?

  • 如果我删除主文件夹中的默认文件夹会怎样?

  • 如何为我的罗技网络摄像头创建 udev 规则 [关闭]

  • 如何在不更改名称的情况下隐藏目录或文件?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何运行 .sh 脚本?

    • 16 个回答
  • Marko Smith

    如何安装 .tar.gz(或 .tar.bz2)文件?

    • 14 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Martin Hope
    Flimm 如何在没有 sudo 的情况下使用 docker? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve