当我为我的文件寻找解决方案时,我发现了一些完美的东西,我在此处提供了答案: 如何为父目录中的每个文件创建一个目录
但现在,我的问题是如何为我正在处理以下命令行的每个文件生成的目录生成 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
一起使用时,它可能会被误解为一个或多个选项。mkdir
tee
rm
请注意,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
循环中没有成功(导致数据丢失),在末尾取消注释也会删除原始文件。