查找和排序 + uniq -c 和 perl 正则表达式

查找和排序 + uniq -c 和 perl 正则表达式

我将一些旧文件/文件夹从 复制/srv/my-old-disk/_oldstuff//srv/my-normal-disk/_oldstuff

我如何获得此分析/srv/my-old-disk/_oldstuff/

然后,如何将某些不需要的权限(例如 400)设置为批量的所需权限集(例如 644)的某些文件类型(文件、目录、链接)更改?

答案1

查找和排序 + uniq -c 和 perl 正则表达式

文件权限批量修改

0) 创建必要的分析文件

  • A) 使用 find 和某些 -printf 标志获取列表

  • B) 使用 sort + uniq -c 获取统计信息

  • C) 获取不具有“正常”权限的文件/目录的列表

    $ cd /srv/dev-disk-by-uuid-f0233da3-473e-450d-9a18-b2ae254fc439/_get/_move
    
    $ find . -printf "%m %y %p\n" > ~/filelist-1a-perms-type-path-findraw.txt
    
    $ cat ~/list-perms-type-path-findraw.txt | sort > ~/filelist-1b-perms-type-path-sorted.txt
    
    $ find . -printf "%m %y\n" > ~/filelist-1c-perms-type-findraw.txt
    
    $ find . ~/filelist-1c-perms-type-findraw.txt | sort | uniq -c | sort > ~/filelist-1d-perms-type-extraordinary.txt
    
    $ perl -ne 'print if /^(?!755 |644 )/' ~/filelist-1b-perms-type-path-sorted.txt ~/filelist-1f-perms-type-path-extraordinary.txt
    
  • 然后您将获得具有以下示例性内容的以下文件。


〜/filelist-1a-perms-type-path-findraw.txt

  • find 的原始输出。

  • 请注意, find 不是按字典顺序遍历,而是按文件系统的逻辑遍历(如果有人能准确解释如何进行,请发表评论)。

    755 d .
    644 f ./Installers-Notes.txt
    644 f ./Installers-Bootdisk.txt
    755 d ./Software
    755 d ./Software/Multiplatform
    644 f ./Software/Multiplatform/.DS_Store
    644 f ./Software/Multiplatform/somesfiles.tgz
    755 d ./Software/Multiplatform/Some Extensions
    644 f ./Software/Multiplatform/Some Extensions/.DS_Store
    644 f ./Software/Multiplatform/Some Extensions/some_plugin.xpi
    ...
    

〜/filelist-1b-perms-type-path-sorted.txt

  • 从最左列到最右列排序

  • 首先按权限,然后按类型(文件、目录、链接等),然后按文件路径。

  • 如果需要,您还可以创建不同的排序顺序。

    444 f ./Software/Mac/Software1.zip
    444 f ./Software/Mac/Software5.cdr
    444 f ./Software/Mac/Software7.zip
    ...
    
    640 f ./Software/Mac/Software2.dmg
    640 f ./Software/Mac/Software3/Software3.dmg
    640 f ./Software/Mac/Software4.zip
    640 f ./Software/Mac/Software6.dmg
    640 f ./Software/Mac/Software7.zip
    ...
    

〜/filelist-1c-perms-type-findraw.txt

  • 1c只是生成1d的辅助文件。

  • 您也可以立即通过管道跳过它。

  • 但对于需要很长时间的长列表,我更喜欢有中间文件,如果我在某个地方犯了错误,我不需要再次从头生成。

  • 您稍后可以通过此离开。

    755 d
    644 f
    644 f
    755 d
    755 d
    644 f
    644 f
    755 d
    644 f
    644 f
    644 f
    

〜/filelist-1d-perms-type-extraordinary.txt

  • 该文件为您提供了一些统计数据。

  • 基于此,您决定要在 1f“非凡”分析文件中列出哪些不常见的文件/文件夹,并相应地调整正则表达式。

          2 555 f
          6 700 d
          7 645 f
         13 600 f
         20 444 f
         22 700 f
         57 640 f
        124 744 f
        423 777 l
      12315 755 d
      35606 755 f
      60759 644 f
    

〜/filelist-1e-perms-type-extraordinary-annotated.txt

  • 这只是一维的欺骗加上你的研究/想法的评论。

    # Files:
          2 555 f
          7 645 f
         13 600 f
         20 444 f # Your remark here why this perms good/bad
         22 700 f
         57 640 f
        124 744 f
      35606 755 f
      60759 644 f
    
    # Directories:
          6 700 d
      12315 755 d
    
    # Links:
        423 777 l
    

〜/filelist-1f-perms-type-path-extraordinary.txt

  • 该文件可帮助您进行分析,并在以后采取行动,例如批量更改权限。
  • 你得到的这个文件的行开头是perl -ne 'print if /^(?!755 |644 )/'
  • 正则表达式解释:
    • 线路起点^

    • 后面不跟(?!expression)这个就是所谓的否定前瞻

    • 表达式为755 |(逻辑或)644

    • 请注意,数字后面的空格不是必需的,因为它们不是 4 位权限表达式,例如“7550”,它可能会不匹配。但我对此更加确定。

      444 f ./Software/Mac/SoftwareA/File1.bom
      444 f ./Software/Mac/SoftwareA/Fil2.pax.gz
      444 f ./Software/Mac/SoftwareA/File3/Contents/PkgInfo
      444 f ./Software/Mac/SoftwareA/File3/Contents/File1.sizes
      444 f ./Software/Mac/SoftwareA/File3/Contents/File2.plist
      444 f ./Software/Mac/SoftwareA/File3/Contents/File3.info
      ...
      
      
      555 f ./Software/Mac/CategoryA/SoftwareB/README.txt
      555 f ./Software/Mac/_Audio Production Software/Propellerheads Reason 5/Source.nfo
      555 f ./Software/Mac/CategoryA/SoftwareC/Source.nfo
      ...
      
  • 此文件列表应该可以帮助您了解哪些目录/文件可能需要调整。
  • 您还可以使用 find 有选择地查找特定类型(文件/目录/链接)和具有特定权限的文件条目,然后将其更改为所需的其他权限。

查找具有特定权限集的文件/文件夹并将其更改为另一个权限集

假设您想要将权限从 444 更改为 644 的所有文件。

1) 让我们打印某个不需要的权限集的所有文件

$ find . -type f -perm 444 -printf "%m %y %p\n"
  • -type f 只查找文件
  • -perm 444拥有权限 444
  • -printf获得适当的输出来控制我们正在做的事情。
    • 注意printf应该是所有过滤条件
    • 否则, if 将打印到目前为止遇到的内容,但不会打印应用下一个过滤器链后剩下的内容。
444 f ./Software/Mac/SoftwareA/File1.bom
444 f ./Software/Mac/SoftwareA/Fil2.pax.gz
444 f ./Software/Mac/SoftwareA/File3/Contents/PkgInfo
444 f ./Software/Mac/SoftwareA/File3/Contents/File1.sizes
444 f ./Software/Mac/SoftwareA/File3/Contents/File2.plist
444 f ./Software/Mac/SoftwareA/File3/Contents/File3.info
...

2)现在让我们批量更改它们

$ find . -type f -perm 444 -printf "%m %y %p\n" -exec chmod 644 {} \;
  • 我们-exec chmod 644 {} \;在最后添加了
  • 在每个通过过滤条件的文件上执行chmod 644
  • 您应该得到与上一步完全相同的列表(如果文件内容自那时以来没有更改)。
  • 如果你遇到错误,你会额外得到它们。

3)最后检查是否执行良好

$ find . -type f -perm 444 -printf "%m %y %p\n"
  • 与步骤 3 中相同的命令行
  • 这次它应该返回 NULL(没有文件列表),因为在我们应用 find 的路径(这是.我们当时的当前工作目录)下面不应该再有 444 的文件

相关内容