将文件重命名为唯一名称并将其移动到单个目标目录中

时间:2017-06-23 18:29:18

标签: bash

我有100个目录,其文件名为content.html以及其他文件。

我正在尝试将所有这些content.html文件复制到1个目录下,但由于它们具有相同的名称,因此会相互覆盖

所以如何在1个目录下重命名和移动所有这些

例如:

./0BD3D9D2-F8B1-4472-95C2-13319650A45C:
card.png  content.html    note.xhtml  quickLook.png   snippet.txt

./0EA34DB4-CD56-42BE-91DA-F631E44FB6E0:
card.png  content.html    note.xhtml  quickLook.png   related     snippet.txt

./1A33F29E-3938-4C2F-BA99-6B98FD045742:
card.png  content.html    note.xhtml  quickLook.png   snippet.txt

命令我试过:

  1. 将content.html重命名为内容

    找到。 -type f | grep content.html |读取f;做mv $ f $ {f / .html /};完成

  2. 将数字附加到文件名"内容"使其独一无二 找到。 -type f | grep内容|读取f;我= 1; echo mv $ f $ f $ i.html; I = I + 1;完成

  3. MacBook-Pro $找到。 -type f | grep内容|读取f;我= 1; echo mv $ f $ f $ i.html; I = I + 1;完成

    mv ./0BD3D9D2-F8B1-4472-95C2-13319650A45C/content ./0BD3D9D2-F8B1-4472-95C2-13319650A45C/content1.html
    
    mv ./0EA34DB4-CD56-42BE-91DA-F631E44FB6E0/content ./0EA34DB4-CD56-42BE-91DA-F631E44FB6E0/content1.html
    mv ./1A33F29E-3938-4C2F-BA99-6B98FD045742/content ./1A33F29E-3938-4C2F-BA99-6B98FD045742/content1.html
    
    1. 一旦上述步骤成功,我应该能够达到我想要的输出:

      找到。 -type f | grep内容|读取f;做mv $ f ../;完成

    2. 然而,我确信我可以在一步命令中执行此操作,而且我的步骤2也不起作用(递增i)

      任何想法为什么step2不起作用?

5 个答案:

答案 0 :(得分:1)

bash 脚本:

#!/bin/bash    
find . -type f -name content.html | while IFS= read -r f; do
    name=$(basename $f)
    ((++i))
    mv "$f" "for_content/${name%.*}$i.html"
done

for_content替换为您的目的地文件夹名称

答案 1 :(得分:0)

假设在您的基目录中,您创建了一个名为import json with open('another.txt') as another: replacements = dict(line.split() for line in another) with open('ajson.json') as j: data = json.load(j) data = {k: replacements.get(v, v) for k,v in data.items()} with open('ajson_new.json', 'w') as j: json.dump(data, j) 的文件夹用于存储 final个文件,然后执行以下操作

content.html

最后,您将以find . -path ./final -prune -o -name "content.html" -print0 | while read -r -d '' name do mv "$name" "./final/content$(mktemp -u XXXX).html" # mktemp with -u option just creates random characters, or it is just a dry run done 格式获取./final文件夹下的所有content.html文件,其中contentXXXX.html是随机字符。

注意:XXXX中的{/ strong> -path ./final -prune -o会阻止它降级到我们的结果文件夹。

答案 2 :(得分:0)

文件的inode应该是唯一的,因此您可以使用以下内容:

find $(pwd) -name "content.html" -printf %f" "%i" "%p"\n" | awk '{ system("mv "$3" <directorytomoveto>"$2$1) }'  

答案 3 :(得分:0)

我会用这样的东西:

find . -type f -name 'test' | awk 'BEGIN{ cnt=0 }{ printf "mv %s ./output-dir/content_%03d.txt\n", $0, cnt++ }' | bash;

您可以将./output-dir/替换为目标目录

示例:

[root@sl7-o2 test]# ls -R
.:
1  2  3  output-dir

./1:
test

./2:
test

./3:
test

./output-dir:

[root@sl7-o2 test]# find . -type f -name 'test' | awk 'BEGIN{ cnt=0 }{ printf "mv %s ./output-dir/content_%03d.txt\n", $0, cnt++ }' | bash;

[root@sl7-o2 test]# ls ./output-dir/
content_000.txt  content_001.txt  content_002.txt

答案 4 :(得分:0)

您可以使用shopt -s globstar递归获取所有content.html个文件,然后使用循环重命名它们:

#!/bin/bash

set -o globstar
counter=0
dest_dir=/path/to/destination
for f in **/content.html; do  # pick up all content.html files
  [[ -f "$f" ]] || continue   # skip if not a regular file
  mv "$f" "$dest_dir/content_$((++counter).html"
done