我有一个文件夹,里面的所有数据都具有以下结构:
Data
-> Group 1
-> Group 2
...
-> Group n
每个子目录中都有许多文件。现在我想创建另一个具有相同结构的目录,并将其中一些文件移动到该新目录中(约占总文件的 20%)
New Data
-> Group 1
-> Group 2
...
-> Group n
我想用某种东西来读取文件夹和文件列表的结构,然后将其通过管道传输到另一个命令来创建和移动文件,但我还不知道语法。谢谢
答案1
您可以使用终端来实现这一点。我提供了 bash 和 fish shell 的说明。如果您不知道您使用的是哪种 shell,那可能是 bash。
首先,导航到包含要移动的文件的文件夹(
Data/
问题中的文件夹)。- 狂欢与钓鱼:
cd /path/to/folder
- 狂欢与钓鱼:
定义要存储移动文件的位置。这可以是相对路径,也可以是绝对路径。
- 重击:
export NEW_DIR="../New Data"
- 鱼:
set NEW_DIR "../New Data"
- 重击:
定义要移动的文件的比例,如果您想要 20%,请将其设置为 5(即 1/5 = 0.2 = 20%):
- 重击:
export FRACTION=5
- 鱼:
set FRACTION 5
- 重击:
运行以下一行代码。请参阅下文以获取更易读的版本:
重击:
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
该脚本会打印它移动的每个文件,因此很容易看到它移动了什么。
可读的 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