将目录的结构(包括子目录)复制到另一个位置并移动一定比例的文件

将目录的结构(包括子目录)复制到另一个位置并移动一定比例的文件

我有一个文件夹,里面的所有数据都具有以下结构:

Data
-> Group 1
-> Group 2
...
-> Group n

每个子目录中都有许多文件。现在我想创建另一个具有相同结构的目录,并将其中一些文件移动到该新目录中(约占总文件的 20%)

New Data
-> Group 1
-> Group 2
...
-> Group n

我想用某种东西来读取文件夹和文件列表的结构,然后将其通过管道传输到另一个命令来创建和移动文件,但我还不知道语法。谢谢

答案1

您可以使用终端来实现这一点。我提供了 bash 和 fish shell 的说明。如果您不知道您使用的是哪种 shell,那可能是 bash。

  1. 首先,导航到包含要移动的文件的文件夹(Data/问题中的文件夹)。

    • 狂欢与钓鱼:cd /path/to/folder
  2. 定义要存储移动文件的位置。这可以是相对路径,也可以是绝对路径。

    • 重击:export NEW_DIR="../New Data"
    • 鱼:set NEW_DIR "../New Data"
  3. 定义要移动的文件的比例,如果您想要 20%,请将其设置为 5(即 1/5 = 0.2 = 20%):

    • 重击:export FRACTION=5
    • 鱼:set FRACTION 5
  4. 运行以下一行代码。请参阅下文以获取更易读的版本:

    • 重击:

      find . -type f | xargs -I _ dirname _ | sort | uniq -c | while read n d; do echo "=== $d ($n files) ==="; if [ $(($n / $FRACTION)) -gt 0 ]; then find "$d" -type f | sort -R | head -n $(($n / $FRACTION)) | while read file; do echo "$file  ->  $NEW_DIR/$d"; mkdir -p "$NEW_DIR/$d"; mv "$file" "$NEW_DIR/$d"; done; fi; echo; done
      
    • 鱼:

      find . -type f | xargs -I _ dirname _ | sort | uniq -c | while read n d; echo "=== $d ($n files) ==="; if math "$n/$FRACTION > 0" > /dev/null; find "$d" -type f | sort -R | head -n (math "$n" / $FRACTION) | while read file; echo "$file  ->  $NEW_DIR/$d"; mkdir -p "$NEW_DIR/$d"; mv "$file" "$NEW_DIR/$d"; end; end; echo; end
      
  5. 该脚本会打印它移动的每个文件,因此很容易看到它移动了什么。

可读的 bash 脚本:

find . -type f | xargs -I _ dirname _ | sort | uniq -c | while read n d; do
  echo "=== $d ($n files) ===";
  if [ $(($n / $FRACTION)) -gt 0 ]; then
    find "$d" -type f | sort -R | head -n $(($n / $FRACTION)) | while read file; do
      echo "$file  ->  $NEW_DIR/$d";
      mkdir -p "$NEW_DIR/$d";
      mv "$file" "$NEW_DIR/$d";
    done;
  fi;
  echo;
done

可读的鱼脚本:

find . -type f | xargs -I _ dirname _ | sort | uniq -c | while read n d;
  echo "=== $d ($n files) ===";
  if math "$n/$FRACTION > 0" > /dev/null;
    find "$d" -type f | sort -R | head -n (math "$n" / $FRACTION) | while read file;
      echo "$file  ->  $NEW_DIR/$d";
      mkdir -p "$NEW_DIR/$d";
      mv "$file" "$NEW_DIR/$d";
    end;
  end;
  echo;
end

相关内容