为每个文件创建一个目录并为每个文件生成“n”个副本

为每个文件创建一个目录并为每个文件生成“n”个副本

当我为我的文件寻找解决方案时,我发现了一些完美的东西,我在此处提供了答案: 如何为父目录中的每个文件创建一个目录

但现在,我的问题是如何为我正在处理以下命令行的每个文件生成的目录生成 50 个副本

ls -p | grep -v / | xargs -t -n1 -i bash -c 'for i in {1..50}; do cp {} "{}_folder/copy${i}_{}" ; done'

得到以下

-file1.csv---->folder_for_file1---->1copy_file1.csv,2copy_file1.csv,3copy_file1.csv........50copy_file1.csv
-file2.csv---->folder_for_file2---->1copy_file2.csv,2copy_file2.csv,3copy_file2.csv........50copy_file2.csv
-file3.csv---->folder_for_file3---->1copy_file3.csv,2copy_file3.csv,3copy_file3.csv........50copy_file3.csv
...
-file256.csv---->folder_forfile256---->1copy_file256.csv,2copy_file256.csv,3copy_file256.csv........50copy_file256.csv

我怎样才能将其与之前的答案相匹配??,包括该答案的功能代码

cd ParentFolder
for x in ./*.csv; do
  mkdir "${x%.*}" && mv "$x" "${x%.*}"

done

所有的功劳都归功于产生这个伟大答案的人,并提前感谢大家

答案1

$name可以在 shell{1..50}"$name"中使用创建50 个字符串,每个字符串以 1 到 50 之间的数字为前缀,后跟一些 string bash

要一次向所有这些写入内容,请使用tee

tee {1..50}"$name" >/dev/null <somefile

...其中somefile的文件的数据应重复五十次。该tee实用程序将其标准输入流复制到其命令行上命名的每个文件中,以及标准输出(这就是我们将其标准输出流重定向到的原因/dev/null)。

为某个目录中的每个常规文件创建一个目录$topdir

[ -n "$topdir" ] && cd -- "$topdir" || exit 1

for name in *; do
    if [ ! -f "$name" ] || [ -h "$name" ]; then
        # $name refers to non-regular file,
        # or to a symbolic link pointing to a regular file.
 
        continue
    fi

    mkdir -- "${name%.*}"
done

用于--表示命令行选项的结束。当我们不知道$name(在这种情况下)是否可以以破折号开头时,使用它很方便,如 中,当与(或或以下)-farse.txt一起使用时,它可能会被误解为一个或多个选项。mkdirteerm

请注意,mkdir如果文件名不包含点,则调用将失败,因为脚本将尝试创建一个名称与现有文件相同的目录。

修改此文件以在新创建的目录中复制该文件五十次(如果创建了该目录),并删除原始文件(从您的问题中不清楚是否要删除原始文件,因此为了rm -f安全起见,我已注释掉):

[ -n "$topdir" ] && cd -- "$topdir" || exit 1

for name in *; do
    if [ ! -f "$name" ] || [ -h "$name" ]; then
        # $name refers to non-regular file,
        # or to a symbolic link pointing to a regular file.
 
        continue
    fi

    destdir=${name%.*}

    if mkdir -- "$destdir" && tee -- "$destdir"/{1..50}"$name" >/dev/null <"$name"
    then
        printf 'Would remove "%s"\n' "$name"
        #rm -f -- "$name"
    fi
done

不使用tee而是使用一个简单的循环来复制文件五十次:

[ -n "$topdir" ] && cd -- "$topdir" || exit 1

for name in *; do
    if [ ! -f "$name" ] || [ -h "$name" ]; then
        # $name refers to non-regular file,
        # or to a symbolic link pointing to a regular file.
 
        continue
    fi

    destdir=${name%.*}

    mkdir -- "$destdir" || continue

    for newname in {1..50}"$name"; do
        cp -- "$name" "$destdir/$newname"
    done

    printf 'Would remove "%s"\n' "$name"
    #rm -f -- "$name"
done

rm -f请注意,即使cp循环中没有成功(导致数据丢失),在末尾取消注释也会删除原始文件。

相关内容