【问题标题】:Find and rename a file in bash or python在 bash 或 python 中查找和重命名文件
【发布时间】:2016-08-10 19:13:45
【问题描述】:

我正在尝试在 bash 或 python 中运行一个脚本,该脚本在目录中找到一个 nfo 文件并重命名它。

就像目录在 /home/disk/xxx/P 里面有文件,这个文件名为 b.nfo 我想重命名为 1.nfo

我尝试了 bash 和 python 都没有运气

重击

cd /home/disk/xxx/P             
for f in *;do                                        
rename ".nfo" "1.nfo"
done

Python

dir = '/home/disk/xxx/P'
x = os.listdir(dir)
for f in x:
 if f.endswith('.nfo'):
new = '/home/disk/xxx/P' +'/'+'1.nfo'      
os.system('mv str(f) new')

这些都不起作用..我做错了什么?

【问题讨论】:

  • 您是否只尝试重命名一个文件?只是 b.nfo?
  • 运行这些脚本时发生了什么?

标签: python bash rename


【解决方案1】:
import glob
for fname in glob.glob("/home/disk/*/P/*.nfo"):
    print "Found :",fname
    # now rename it or whatever ...
    new_name = fname.replace(".nfo",".1.nfo")
    os.rename(fname,new_name)

相同的文件将在 bash 中与 ls /home/disk/*/P/*.nfo 匹配

【讨论】:

  • 这也会在旧文件中添加一个 .1 .. 也许我解释的不好.. 我想将整个名称重命名为 1.nfo ..
【解决方案2】:

要在 python 中重命名文件,您可以使用 os.rename(src, dest) http://www.tutorialspoint.com/python/os_rename.htm

至于您自己的代码,它不起作用,因为os.system('mv str(f) new') 实际上执行了命令“mv str(f) new”。如果你想使用参数,你应该这样做:os.system('mv %s %s' % (f, new))。但无论如何不要使用 os.system,使用 os.rename()。它更干净,适用于所有平台。

【讨论】:

    【解决方案3】:

    试试这个:os.rename(path_to_file, path_to_renamed_file)

    【讨论】:

      【解决方案4】:

      如果这只是您正在执行的单个文件...尝试:

      #!/bin/bash
      cd /home/disk/xxx/P
      findIt=$(find . -type f -name b.nfo)
      if [[ ${findIt} != "" ]] ; then
        mv ${findIt} 1.nfo
      else
        echo "File was not found"
      fi
      

      【讨论】:

      • findIt=$(find . -type f "*.nfo"),如果您不知道该文件将被准确调用什么
      • 如果该位置可能存在多个“.nfo”文件,您将需要为我上面的评论添加更好的字符串处理
      • find:路径必须在表达式之前:*.nfo 用法:find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates| opt|exec] [路径...] [表达式] 找不到文件
      • @AndrewStef 好了,我的 find 命令写错了。现在应该可以工作了
      • 差不多了.. 现在它说目标 1.nfo 不是目录
      【解决方案5】:

      您可以使用模块osglob

      import glob
      import os
      
      dir_ = '/home/disk/xxx/P'
      for fn in glob.glob(os.path.join(dir_, '*.nfo')): 
          os.rename(fn, os.path.join(os.path.split(fn)[0], '1.nfo'))
      

      【讨论】:

      • 实际上这会将旧文件重命名为 oldfile1.nfo
      • 你是对的。我误解了这个问题。固定。
      • 刚刚又试了一次。为我工作。不是有文件/home/disk/xxx/P1.nfo吗?
      • 不,它创建了一个类似 oldfile1 的文件
      • 我修改了我的答案。你试过新版本了吗?
      【解决方案6】:

      我不确定你想做什么。随着复杂程度的提高:

      mv /home/disk/xxx/P/b.nfo /home/disk/xxx/P/1.nfo

      if [ -f /home/disk/xxx/P/b.nfo   ]; then
         mv /home/disk/xxx/P/b.nfo /home/disk/xxx/P/1.nfo
      else
         echo "b.nfo not found"
      fi
      

      for nfofile in /home/disk/xxx/P/*.nfo
      do
          newname=$(echo $nfofile | <some sort of name transformation>)
          mv $nfofile $newname
      done
      

      【讨论】:

        猜你喜欢
        • 2015-05-09
        • 2013-02-07
        • 2011-02-02
        • 1970-01-01
        • 2020-02-18
        • 2012-12-31
        • 2011-08-14
        • 1970-01-01
        • 2013-12-08
        相关资源
        最近更新 更多