根据文本文件将文件移回原始位置

nbn*_*lko 2 macos bash terminal awk find

我用mv -v命令移动了一堆文件.所以最后我有一个包含这样的文本文件:`

 /Volumes/[TV Shows]/Movie 1.avi --> /Volumes/Downloads/Movie 1.avi
 /Volumes/[TV Shows]/Movie 2.mp4 --> /Volumes/Downloads/Movie 2.mp4
Run Code Online (Sandbox Code Playgroud)

`

我需要Downloads根据此文本文件将每个文件从后面移动到其原始位置.原始位置将是-->我的文本文件内部之前的字符串.匹配标准是filename.

任何帮助将非常感激.

@jeremysprofile

我的文件可以在这里找到

在我的Mac上,我使用了以下代码:

#!/bin/bash

while IFS= read -r line; do
    #use http://wiki.bash-hackers.org/syntax/pe#substring_removal to grab the parts we want
    origin=${line% --> *}
    current=${line#* --> }
    mv -- "$current" "$origin"
done < ~/Desktop/myTextFile.txt
Run Code Online (Sandbox Code Playgroud)

结果的第一行是:

WYSIWYG:Desktop cip$ ./myMove.sh
mv: rename /Volumes/Public/English/[Sorted TV Shows]/Dimension/Dimension.404.s01e01.WEBDL.720p.NewStudio.TV.mkv -> /Volumes/Public/Downloads/from_tv_shows/Dimension.404.s01e01.WEBDL.720p.NewStudio.TV.mkv to /Volumes/Public/English/[Sorted TV Shows]/Dimension/Dimension.404.s01e01.WEBDL.720p.NewStudio.TV.mkv -> /Volumes/Public/Downloads/from_tv_shows/Dimension.404.s01e01.WEBDL.720p.NewStudio.TV.mkv: No such file or directory
mv: rename /Volumes/Public/English/[Sorted TV Shows]/Dimension/Dimension.404.S01E02.Polybius.HULU.WEBRip.x264-RBB.mp4 -> /Volumes/Public/Downloads/from_tv_shows/Dimension.404.S01E02.Polybius.HULU.WEBRip.x264-RBB.mp4 to /Volumes/Public/English/[Sorted TV Shows]/Dimension/Dimension.404.S01E02.Polybius.HULU.WEBRip.x264-RBB.mp4 -> /Volumes/Public/Downloads/from_tv_shows/Dimension.404.S01E02.Polybius.HULU.WEBRip.x264-RBB.mp4: No such file or directory
mv: rename /Volumes/Public/English/[Sorted TV Shows]/Dimension/Dimension.404.S01E03.Bob.HULU.WEBRip.x264-RBB.mp4 -> /Volumes/Public/Downloads/from_tv_shows/Dimension.404.S01E03.Bob.HULU.WEBRip.x264-RBB.mp4 to /Volumes/Public/English/[Sorted TV Shows]/Dimension/Dimension.404.S01E03.Bob.HULU.WEBRip.x264-RBB.mp4 -> /Volumes/Public/Downloads/from_tv_shows/Dimension.404.S01E03.Bob.HULU.WEBRip.x264-RBB.mp4: No such file or directory
mv: rename /Volumes/Public/English/[Sorted TV Shows]/Dimension/Dimension.404.S01E04.WEBRip x264-RMTeam.mkv -> /Volumes/Public/Downloads/from_tv_shows/Dimension.404.S01E04.WEBRip x264-RMTeam.mkv to /Volumes/Public/English/[Sorted TV Shows]/Dimension/Dimension.404.S01E04.WEBRip x264-RMTeam.mkv -> /Volumes/Public/Downloads/from_tv_shows/Dimension.404.S01E04.WEBRip x264-RMTeam.mkv: No such file or directory
Run Code Online (Sandbox Code Playgroud)

我想提一下,/Volume/Public我的计算机上已正确映射,并且文件存在于该from_tv_shows位置:

WYSIWYG:Desktop cip$ find /Volumes/Public/Downloads/from_tv_shows/ -name 'Dimension.404.S01E04.WEBRip x264-RMTeam.mkv'
/Volumes/Public/Downloads/from_tv_shows//Dimension.404.S01E04.WEBRip x264-RMTeam.mkv
WYSIWYG:Desktop cip$ 
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

jer*_*ile 5

while IFS= read -r line; do
    #use http://wiki.bash-hackers.org/syntax/pe#substring_removal to grab the parts we want
    origin=${line% --> *}
    current=${line#* --> }
    mv -- "$current" "$origin" 
done < myTextFile.txt
Run Code Online (Sandbox Code Playgroud)

我们进行子字符串删除,%将所有内容保存在子字符串之前(所以我们先保留所有内容 --> ),然后#保留所有内容(所以我们保留所有内容 --> ),*作为多字符通配符.

以下是bash"for line in file"语法的工作原理.