Как можно скопировать все содержимое, за исключением папки tmp, и затем переместить это содержимое в папку tmp?

Здравствуйте. <br/> Я использую функцию <b>fs.cpSync</b> для копирования, и у меня возник вопрос: <br/> Как можно скопировать все содержимое, кроме папки <b>tmp</b>, и при этом перенести скопированное в папку <b>tmp</b>? <br/> Я пробовал использовать <b>filter</b>, но все равно сталкиваюсь с ошибкой, связанной с рекурсией. <br/> <br/> <pre><code class="javascript">fs.cpSync('../','../tmp',{ filter:(src)=&gt;(new RegExp("..\layout","iu").test(src))?false:true,recursive:true});</code></pre>
  • 23 апреля 2025 г. 13:55
Ответы на вопрос 2
Для выполнения задачи по копированию всех файлов и папок, кроме папки `tmp`, и перемещения их в папку `tmp`, вы можете использовать модуль `fs` из Node.js и реализовать фильтрацию с помощью регулярного выражения. Однако, правильный способ избежать ошибок рекурсии заключается в использовании специальных опций и более аккуратной фильтрации.

Вот пример кода, который выполняет вашу задачу:

```javascript
const fs = require('fs');
const path = require('path');

const sourceDir = '../'; // Путь к исходной директории
const targetDir = path.join(sourceDir, 'tmp'); // Папка назначения

// Функция для копирования содержимого с фильтрацией
function copyFiles(src, dest) {
    fs.cpSync(src, dest, {
        recursive: true,
        filter: (srcPath) => {
            // Проверяем, не является ли путь папкой tmp
            return !srcPath.includes('/tmp');
        },
    });
}

// Убедимся, что папка назначения существует
if (!fs.existsSync(targetDir)){
    fs.mkdirSync(targetDir);
}

// Копируем все содержимое, за исключением папки tmp
copyFiles(sourceDir, targetDir);
```

### Объяснение:

1. **Импорт библиотек**: Мы используем `fs` для работы с файловой системой и `path` для обработки путей.
2. **Определение директорий**: Указываем путь к исходной директории и к целевой директории `tmp`.
3. **Функция `copyFiles`**: Эта функция копирует файлы и папки из `src` в `dest`, исключая папку `tmp`. Используется опция `filter`, чтобы отфильтровать пути.
4. **Проверка на существование папки назначения**: Мы проверяем, чтобы папка `tmp` существовала, если нет — создаем ее.
5. **Копирование файлов**: Вызов функции `copyFiles` выполняет основную задачу.

Таким образом, вы сможете скопировать содержимое без папки `tmp` в само `tmp`, избегая ошибок рекурсии.
<pre><code class="javascript">async copy(from,to,ignore=[]){
	const recursive = async (from,to,ignore) =&gt; {
		this.fs.readdirSync(from,{withFileTypes:true}).filter((file)=&gt;{
			if(ignore &amp;&amp; ignore.length){
				if(ignore.filter((name)=&gt;(new RegExp(name,"iu").test(file.name))?true:false).length&gt;0) return false;
			}
			return true;
		}).map((file)=&gt;{
			const fromPath  = `${from.slice(0,from.length-(from.slice(-1)==='/'))}/${file.name}`;
			const toPath    = `${to.slice(0,to.length-(to.slice(-1)==='/'))}/${file.name}`;
			if (file.isDirectory()) {
				this.fs.mkdirSync(toPath,{recursive:true});
				recursive(fromPath,toPath,[]);
			}else{
				this.fs.cpSync(fromPath,toPath);
			}
		})
	};
	await recursive(from,to,ignore);
}</code></pre>
Похожие вопросы