Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 调整文件重命名脚本,以便它搜索子目录中的每个文件_Arrays_Linux_Bash_Rename - Fatal编程技术网

Arrays 调整文件重命名脚本,以便它搜索子目录中的每个文件

Arrays 调整文件重命名脚本,以便它搜索子目录中的每个文件,arrays,linux,bash,rename,Arrays,Linux,Bash,Rename,我有一个.csv文件,其中的内容如下: unnamed_0711-42_p1.mov,day1_0711-42_p1.mov unnamed_0711-51_p2.mov,day1_0711-51_p2.mov unnamed_0716-42_p1_2.mov,day1_0716-42_p1_2.mov unnamed_0716-51_p2_2.mov,day1_0716-51_p2_2.mov 我编写此代码是为了将文件从字段1中的名称(例如unnamed_0711-42_p1.mov)重命名

我有一个
.csv
文件,其中的内容如下:

unnamed_0711-42_p1.mov,day1_0711-42_p1.mov
unnamed_0711-51_p2.mov,day1_0711-51_p2.mov
unnamed_0716-42_p1_2.mov,day1_0716-42_p1_2.mov
unnamed_0716-51_p2_2.mov,day1_0716-51_p2_2.mov
我编写此代码是为了将文件从字段1中的名称(例如
unnamed_0711-42_p1.mov
)重命名为字段2中的名称(例如
day1_0711-42_p1.mov

但是,此脚本仅在它和所有需要重命名的文件位于同一目录中时才起作用。这在以前是可以的,但是现在我需要在不同的子目录中查找文件(无需将完整路径添加到我的
.csv
文件)

如何调整脚本,以便在子目录中搜索文件,然后像以前一样更改名称?

下面是脚本

while IFS=, read -ra arr # -r to prevent mangling backslashes
do
 find . -type f -name "${arr[0]}" -printf "mv '%p' '%h/${arr[1]}'" | bash
done<csvfile
当IFS=时,读取-ra arr#-r以防止弄乱反斜杠
做
找到-键入f-名称“${arr[0]}”-printf“mv'%p'%h/${arr[1]}'”|bash

done实现此功能的一种简单方法,尽管会导致脚本效率低下,但它是:

for D in `find . -type d`
do
    cat $csv | while IFS=, read -r -a arr; do mv "${arr[@]}"; done
done
这将对当前目录中的每个目录运行您的命令,但它将贯穿每个子目录的整个文件名列表。另一种方法是在处理每个文件的名称时搜索该文件:

csv=files.csv
while IFS=, read -ra arr; do
    while IFS= read -r -d '' old_file; do
        old_dir=$(dirname "$old_file")
        mv "$old_file" "$old_dir/${arr[1]}"
    done < <(find . -name "${arr[0]}" -print0)
done<"$csv"
csv=files.csv
当IFS=,read-ra-arr;做
而IFS=read-r-d“”旧_文件;做
old_dir=$(dirname“$old_file”)
mv“$old_file”“$old_dir/${arr[1]}”

完成<你能重新表述第一行不清楚的内容吗?已编辑,希望更清楚。
unnamed\u 0711-42\u p1.mov
的位置在哪里。脚本运行的位置是否相同?请澄清,我当前使用的脚本(请参阅我的代码)与文件位于同一目录中-我需要递归搜索的脚本,即它与文件不在同一目录中(请参阅我问题的最后一段)。嗨,sjjam,这不起作用,每个文件都有一个错误mv:无法统计'examplefillename.mov':没有这样的文件或目录”“我不知道;我不认为这段代码是递归搜索,它似乎只是在脚本所在的目录中搜索。这甚至不能正确处理
.csv
文件中的对。在
mv
前面添加一个
echo
,这一点很明显。@bms9nmh:我已经更新了我的答案。请看一看。@mona\u sax:code>%p
不包含非标准文件名,但用单引号包装它是解决您为另一个答案指出的问题的一个解决办法。请查看编辑。这似乎不起作用,只是为了澄清,对于“dirname”,我应该输入所有文件所在的顶级/主文件夹(在子目录中)正确吗?/rename.sh:第7行:/DG1440/tester_delete/anotherlevel:是目录mv:无法创建常规文件“/day63_testday2p1_0929-36_p1.mov”:权限denied@bms9nmh不,“dirname”是一个命令。在我提供的脚本中,您应该编辑的唯一内容是csv文件的名称。好的,对不起,我会尝试一下,然后返回给您。@mona_sax:
“$old_dir/${arr[1]}周围的双引号
会注意这里的分词,所以我说这不会处理非标准文件名,这是正确的。这个脚本在我的测试结果确认时起作用。尽管我觉得第二个while循环是多余的。
csv=files.csv
while IFS=, read -ra arr; do
    while IFS= read -r -d '' old_file; do
        old_dir=$(dirname "$old_file")
        mv "$old_file" "$old_dir/${arr[1]}"
    done < <(find . -name "${arr[0]}" -print0)
done<"$csv"