【问题标题】:Command to truncate all filenames at 255 characters命令以 255 个字符截断所有文件名
【发布时间】:2010-10-23 03:13:24
【问题描述】:

一个 NTFS 目录在 bash shell 中打开。什么命令会递归地将目录中的所有文件名截断到 ext3 所需的 255 个字符限制?

【问题讨论】:

    标签: rename ntfs filenames ext3 fat32


    【解决方案1】:

    假设 shell 位于 NTFS 目录中,因为它是 PWD:

    for f in *; do mv $f ${f:0:255}; done

    类似于 Dave 基于 sed 的版本,但避免了每个文件的 exec。由于最大命令行限制,会在一个非常大的目录上爆炸,并且不会执行子目录。

    【讨论】:

      【解决方案2】:

      如果您有权访问 Windows shell,则可以使用:

      @echo off
      setlocal EnableDelayedExpansion
      
      REM  loop over all files in the cwd
      for /f %%a in ('dir /a-d /b') do (
         REM  store this filename in a variable so we can do substringing
         set ThisFileName=%%a
         REM  now take a substring
         set ThisShortFileName=!ThisFileName:~0,255!
         REM  finally, the rename:
         echo ren %%a !ThisShortFileName!
      )
      
      
      :EOF
      endlocal
      

      (注意:我在重命名命令之前添加了一个回显,以便您可以在实际运行之前直观地验证它是否有效。适用于我的盒子。)

      我确信现在使用 *nix 机器的人可以为 bash 编写类似的脚本,但我被困在 Windows 世界中 :)

      祝你好运!

      【讨论】:

      • 这行得通,但我不得不使文件名更短,因为目录计入 255 个字符。
      【解决方案3】:
      $ cat truncname 
      #!/bin/bash
      # requires basename, dirname, and sed
      mv $1 `dirname $1`/`basename $1 | sed 's/^\(.\{0,255\}\).*/\1/'`
      $ chmod a+x truncname 
      $ find . -exec ./truncname {} \;
      

      【讨论】:

      • 我尝试在文件夹上运行 shell 脚本并得到以下错误:prompt:/media/DUALOS$ sh ~/truncname.sh stuff /home/username/truncname.sh: 1: $:未找到 mv:无法移动 stuff' to a subdirectory of itself, ./stuff/stuff' /home/username/truncname.sh:5:$:未找到 /home/username/truncname.sh:6:$:未找到
      猜你喜欢
      • 2010-12-03
      • 1970-01-01
      • 2017-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-21
      相关资源
      最近更新 更多