如何将分散在文件系统中的所有同名文件移动到一个文件夹中?

Abd*_*red 6 command-line filesystems find

我有一个文件系统树,其中的不同位置是同名的文件。我在命令行上尝试了以下命令:

find / -name "HAHA" -exec mv {} /home \;
Run Code Online (Sandbox Code Playgroud)

它仅适用于一个文件,对于其他文件,我收到了具有相同名称的错误消息。

我可以更改命令,为每个文件名附加一个数字来区分它们吗?

在此处输入图片说明

Tbl*_*lue 11

我可以想到两种可能的解决方案:

  1. 如果您是mvGNU coreutils安装的(可能是这种情况),那么以下命令...

    find / -name "HAHA" -type f -exec mv --backup=numbered "{}" /home \;
    
    Run Code Online (Sandbox Code Playgroud)

    ...将所有文件移动HAHA/home. 该--backup=numbered 选项mv保证,每一次mv命令执行时,它会检查是否已经存在一个文件名为HAHA在目标目录-如果确实如此,那么它首先将其重命名为HAHA.~n~(其中n移动新的文件之前是越来越多)到/home. 最终,你将最终命名为喜欢的文件HAHAHAHA.~1~HAHA.~2~等。在/home

  2. 这个 shell 脚本应该可以解决问题,但它不能抵抗包含换行符的路径:

    IFS="
    "      # if you are using bash, you can just use IFS=$'\n' here
    i=1
    for file in $(find / -name "HAHA" -type f); do
      mv "${file}" "/home/HAHA${i}"
      i=$((${i} + 1))
    done
    
    Run Code Online (Sandbox Code Playgroud)

    这将迭代所有HAHA文件并将每个文件移动到/home/HAHAn,其中n再次增加数字,从 1 开始。


unx*_*nut 4

我找到了一个带有小脚本的简单解决方案。该脚本被称为cpf(或您给它起的任何名称),如下所示:

#!/bin/bash

dir=xyz       # Directory where you want the files
num=1

for file in "$@"
do
    base=`basename -- "$file"`
    mv -- "$file" "$dir/$base.$num"
    num=$(($num+1))
done
Run Code Online (Sandbox Code Playgroud)

您执行命令如下:

find . -name HAHA -print0 | xargs -0x cpf
Run Code Online (Sandbox Code Playgroud)

  • 这里强烈推荐使用“xargs -x”。否则,xargs 可能会默默地决定启动几个连续的“cpf”进程,每个进程都有自己的计数器并开始覆盖已经移动的哈哈。 (9认同)